如何接收最奇怪的命令行参数?

正如在其他线程中所讨论的那样如何避免cmd.exe解释shell特殊字符(如<> ^) ,从命令行获取所有参数并不容易。

一个简单的

set var=%1 set "var=%~1" 

是不够的,如果你有这样的要求

 myBatch.bat abc"&"^&def 

我有一个解决scheme,但它需要一个临时文件,也不是防弹的。

 @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循环,但我不知道如何改变这一点。
也许还有另一个简单的解决scheme

我不需要这个解决实际问题,但是我喜欢在每种情况下都是防弹的解决scheme,而不是在大多数情况下。

我不认为有人发现有任何漏洞,除了无法读取参数中的换行符:

 @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一块。

用户input命令来转义任何特殊字符。 你的程序在你的程序运行之前不能做什么。 没有其他的“防弹”解决scheme。