我一直在将一些shell代码翻译成MS-DOS Batch。在我的代码中,我有样本:
for %%i in (%*) do set "clargs=!clargs! %%i"
如果我输入参数“ - ?” (没有引号),它不会添加到clargs中。我认为这是因为'?'是一个通配符。有什么我可以做的,以确保因为问号位于参数中而不做特殊的事情吗?
答案 0 :(得分:2)
你是对的,在FOR IN()子句中使用时,外卡字符*
和?
总是会扩展。不幸的是,没有办法阻止通配符扩展。
如果包含通配符,则不能使用FOR循环访问所有参数。相反,您应该使用GOTO循环以及SHIFT命令。
set clargs=%1
:parmLoop
if "%~1" neq "" (
set clargs=%clargs% %1
shift /1
goto :parmLoop
)
虽然您的示例非常愚蠢,但由于生成的clargs
变量最终包含%*
中已包含的同一组值。如果您只想设置一个包含所有值的变量,只需使用set clargs=%*
更典型的是,创建了一个参数变量的“数组”。
set argCnt=0
:parmLoop
if "%~1" equ "" goto :parmsDone
set /a argCnt+=1
set arg%argCnt%=%1
shift /1
goto :parmLoop
:parmsDone
:: Working with the "array" of arguments is best done with delayed expansion
setlocal enableDelayedExpansion
for /l %%N in (1 1 %argCnt%) do echo arg%%N = !arg%%N!
请参阅Windows Bat file optional argument parsing以获取处理传递给Windows批处理脚本的unix样式参数的强大方法。
答案 1 :(得分:0)
@ECHO OFF
SETLOCAL
SET dummy=%*
FOR /f "tokens=1*delims==" %%f IN ('set dummy') DO CALL :addme %%g
ECHO %clargs%
GOTO :eof
:addme
IF "%~1"=="" GOTO :EOF
IF DEFINED clargs SET clargs=%clargs% %1
IF NOT DEFINED clargs SET clargs=%1
SHIFT
GOTO addme
我非常怀疑你会得到一个完全防弹的解决方案。例如,上面的解决方案将删除分隔符(逗号,分号,等号)。其他解决方案可能会出现近括号的问题;有永久%
和^
问题 - 但它会处理-?
但就你的目的而言,从你所展示的内容来看,
出了什么问题set clargs=%clargs% %*
(毫无疑问,你会想要进一步处理,但是我们还要努力...)