如另一个线程How to avoid cmd.exe interpreting shell special characters like < > ^中所述
从命令行获取所有参数并不容易。
一个简单的
set var=%1
set "var=%~1"
还不够,如果您有这样的要求
myBatch.bat abc"&"^&def
我有一个解决方案,但是它需要一个临时文件,并且也不是防弹的。
@echo off
setlocal DisableDelayedExpansion
set "prompt=X"
(
@echo on
for %%a in (4) do (
rem #%1#
)
) > XY.txt
@echo off
for /F "delims=" %%a in (xy.txt) DO (
set "param=%%a"
)
setlocal EnableDelayedExpansion
set param=!param:~7,-4!
echo param='!param!'
它失败,并显示诸如myBatch.bat%a之类的错误,它显示4而不是%a
在这种情况下,简单的回声%1将起作用。
显然这是for循环,但我不知道如何更改。
也许存在另一个简单的解决方案。
我不需要这个来解决实际的问题,但是我喜欢在每种情况下(不仅在大多数情况下)都是防弹解决方案的解决方案。
最佳答案
除了无法读取参数中的换行符,我认为没有人发现此漏洞:
@echo off
setlocal enableDelayedExpansion
set argCnt=1
:getArgs
>"%temp%\getArg.txt" <"%temp%\getArg.txt" (
setlocal disableExtensions
set prompt=#
echo on
for %%a in (%%a) do rem . %1.
echo off
endlocal
set /p "arg%argCnt%="
set /p "arg%argCnt%="
set "arg%argCnt%=!arg%argCnt%:~7,-2!"
if defined arg%argCnt% (
set /a argCnt+=1
shift /1
goto :getArgs
) else set /a argCnt-=1
)
del "%temp%\getArg.txt"
set arg
以上内容来自热烈的DosTips讨论-http://www.dostips.com/forum/viewtopic.php?p=13002#p13002。 DosTips用户Liviu提出了关键的
SETLOCAL DisableExtensions
部分。
关于batch-file - 如何接收最奇怪的命令行参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4200316/