Get list of passed arguments in Windows batch script (.bat)
dancavallaro has it right, %*
for all command line parameters (excluding the script name itself). You might also find these useful:
%0
- the command used to call the batch file (could be foo
, ..\foo
, c:\bats\foo.bat
, etc.)
%1
is the first command line parameter,
%2
is the second command line parameter,
and so on till %9
(and SHIFT
can be used for those after the 9th).
%~nx0
- the actual name of the batch file, regardless of calling method (some-batch.bat)
%~dp0
- drive and path to the script (d:\scripts)
%~dpnx0
- is the fully qualified path name of the script (d:\scripts\some-batch.bat)
More info examples at https://www.ss64.com/nt/syntax-args.html and https://www.robvanderwoude.com/parameters.html
%*
seems to hold all of the arguments passed to the script.
%1
... %n
and %*
holds the arguments, but it can be tricky to access them, because the content will be interpreted.
Therefore it is impossible to handle something like this with normal statements
myBatch.bat "&"^&
Each line fails, as cmd.exe try to execute one of the ampersands (the content of %1 is "&"&
)
set var=%1
set "var=%1"
set var=%~1
set "var=%~1"
But there exists a workaround with a temporary file
@echo off
SETLOCAL DisableDelayedExpansion
SETLOCAL
for %%a in (1) do (
set "prompt=$_"
echo on
for %%b in (1) do rem * #%1#
@echo off
) > param.txt
ENDLOCAL
for /F "delims=" %%L in (param.txt) do (
set "param1=%%L"
)
SETLOCAL EnableDelayedExpansion
set "param1=!param1:*#=!"
set "param1=!param1:~0,-2!"
echo %%1 is '!param1!'
The trick is to enable echo on
and expand the %1
after a rem
statement (works also with %2 .. %*).
But to be able to redirect the output of echo on
, you need the two FOR-LOOPS.
The extra characters * #
are used to be safe against contents like /?
(would show the help for REM).
Or a caret ^ at the line end could work as a multiline character.
The FOR /F should be work with delayed expansion off, else contents with "!" would be destroyed.
After removing the extra characters in param1
and you got it.
And to use param1
in a safe way, enable the delayed expansion.
Edit: One remark to %0
%0
contains the command used to call the batch, also preserving the case like in FoO.BaT
But after a call to a function %0
and also in %~0
contains the function name (or better the string that was used to call the function).
But with %~f0
you still can recall the filename.
@echo off
echo main %0, %~0, %~f0
call :myLabel+xyz
exit /b
:MYlabel
echo func %0, %~0, %~f0
exit /b
Output
main test.bat, test.bat, C:\temp\test.bat
func :myLabel+xyz, :myLabel+xyz, C:\temp\test.bat