Batch files - number of command line arguments

后端 未结 8 1896
走了就别回头了
走了就别回头了 2020-12-04 09:48

Just converting some shell scripts into batch files and there is one thing I can\'t seem to find...and that is a simple count of the number of command line arguments.

<
相关标签:
8条回答
  • 2020-12-04 10:17

    If the number of arguments should be an exact number (less or equal to 9), then this is a simple way to check it:

    if "%2" == "" goto args_count_wrong
    if "%3" == "" goto args_count_ok
    
    :args_count_wrong
    echo I need exactly two command line arguments
    exit /b 1
    
    :args_count_ok
    
    0 讨论(0)
  • 2020-12-04 10:18

    Avoids using either shift or a for cycle at the cost of size and readability.

    @echo off
    setlocal EnableExtensions EnableDelayedExpansion
    set /a arg_idx=1
    set "curr_arg_value="
    :loop1
    if !arg_idx! GTR 9 goto :done
    set curr_arg_label=%%!arg_idx!
    call :get_value curr_arg_value !curr_arg_label!
    if defined curr_arg_value (
      echo/!curr_arg_label!: !curr_arg_value!
      set /a arg_idx+=1
      goto :loop1
    )
    :done
    set /a cnt=!arg_idx!-1
    echo/argument count: !cnt!
    endlocal
    goto :eof
    
    :get_value
    (
      set %1=%2
    )
    

    Output:

    count_cmdline_args.bat testing more_testing arg3 another_arg
    
    %1: testing
    %2: more_testing
    %3: arg3
    %4: another_arg
    argument count: 4
    

    EDIT: The "trick" used here involves:

    1. Constructing a string that represents a currently evaluated command-line argument variable (i.e. "%1", "%2" etc.) using a string that contains a percent character (%%) and a counter variable arg_idx on each loop iteration.

    2. Storing that string into a variable curr_arg_label.

    3. Passing both that string (!curr_arg_label!) and a return variable's name (curr_arg_value) to a primitive subprogram get_value.

    4. In the subprogram its first argument's (%1) value is used on the left side of assignment (set) and its second argument's (%2) value on the right. However, when the second subprogram's argument is passed it is resolved into value of the main program's command-line argument by the command interpreter. That is, what is passed is not, for example, "%4" but whatever value the fourth command-line argument variable holds ("another_arg" in the sample usage).

    5. Then the variable given to the subprogram as return variable (curr_arg_value) is tested for being undefined, which would happen if currently evaluated command-line argument is absent. Initially this was a comparison of the return variable's value wrapped in square brackets to empty square brackets (which is the only way I know of testing program or subprogram arguments which may contain quotes and was an overlooked leftover from trial-and-error phase) but was since fixed to how it is now.

    0 讨论(0)
提交回复
热议问题