Command-line arguments
suggest changeThe command-line arguments AKA command-line parameters passed to a batch script are accessible as %1
, %2
, ..., %9
. There can be more than nine arguments; to access them, see how to loop over all of them below.
The syntax %0
does not refer to a command-line argument but rather to the name of the batch file.
Testing for whether the first command-line argument has been provided:
if not -%1-==-- echo Argument one provided
if -%1-==-- echo Argument one not provided & exit /b
A robust looping over all command-line arguments using SHIFT
(for each command-line argument, ...):
:argactionstart
if -%1-==-- goto argactionend
echo %1 & REM Or do any other thing with the argument
shift
goto argactionstart
:argactionend
A robust looping over all command-line arguments using SHIFT
without modifying %1
, %2
, etc.:
call :argactionstart %*
echo Arg one: %1 & REM %1, %2, etc. are unmodified in this location
exit /b
:argactionstart
if -%1-==-- goto argactionend
echo %1 & REM Or do any other thing with the argument
shift
goto argactionstart
:argactionend
exit /b
Transferring command-line arguments to environment variables:
setlocal EnableDelayedExpansion
REM Prevent affecting possible callers of the batch
REM Without delayed expansion, !arg%argno%! used below won't work.
set argcount=0
:argactionstart
if -%1-==-- goto argactionend
set /a argcount+=1
set arg%argcount%=%1
shift
goto argactionstart
:argactionend
set argno=0
:loopstart
set /a argno+=1
if %argno% gtr %argcount% goto loopend
echo !arg%argno%! & REM Or do any other thing with the argument
goto loopstart
:loopend
Looping over all command-line arguments, albeit not a robust one:
for %%i in (%*) do (
echo %%i
)
This looks elegant but is non-robust, maltreating arguments containing wildcards (*
, ?
). In particular, the above for command replaces arguments that contain wildcards (*
, ?
) with file names that match them, or drops them if no files match. Nonetheless, the above loop works as expected as long as the passed arguments do not contain wildcards.
Finding the number of command-line arguments, in a non-robust way:
set argcount=0
for %%i in (%*) do set /a argcount+=1
Again, this does not work with arguments containing wildcards.
The maximum possible number of arguments is greater than 4000, as empirically determined on a Windows Vista machine. The number can differ on Windows XP and Windows 7.
In passing arguments to a batch script, characters used for argument separation are the following ones:
- space
- comma
- semicolon
- equal sign
- tab character
Thus, the following lines pass the same four arguments:
test.bat a b c d
test.bat a,b,c,d
test.bat a, b, c, d
test.bat a;b;c;d
test.bat a=b=c=d
test.bat a b,c;,;=d
Yes, even the line with a b,c;,;=d
passes four arguments, since a sequence of separating characters is considered a single separator.
To have a space, comma or semicolon in the argument value, you can pass the value enclosed in quotation marks. However, the quotation marks become part of the argument value. To get rid of the enclosing quotation marks when referring to the argument in the script, you can use %~<number>
described in percent tilde.
When passing arguments to an invoked command rather than a batch script, you usually need to separate the command from the first argument using a space. However, for internal commands, that separation is not necessary if the first character after the command name is one of a couple of symbols, including .\/
, and more:
echo.
- Outputs a newline.
tree.
- Fails: "tree." not found. tree is an external command.
dir..
- Lists the content of the parent directory.
cd..
- Changes the current directory to the parent one.
cd\
- Changes the current directory to the root one.
start.
- Opens Windows Explorer from the current directory.
dir/b/s
- Lists directory content recursively, showing full paths.
Links:
- Parameters / Arguments at ss64
- Escape Characters, Delimiters and Quotes at ss64
- Using batch parameters at Microsoft