Batch For Loop:在字符串中使用通配符

时间:2013-05-26 14:29:22

标签: for-loop batch-file wildcard glob

我一直在将一些shell代码翻译成MS-DOS Batch。在我的代码中,我有样本:

for %%i in (%*) do set "clargs=!clargs! %%i"

如果我输入参数“ - ?” (没有引号),它不会添加到clargs中。我认为这是因为'?'是一个通配符。有什么我可以做的,以确保因为问号位于参数中而不做特殊的事情吗?

2 个答案:

答案 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% %*

(毫无疑问,你会想要进一步处理,但是我们还要努力...)