%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