For loop 循环批处理:在字符串中使用通配符

For loop 循环批处理:在字符串中使用通配符,for-loop,batch-file,wildcard,glob,For Loop,Batch File,Wildcard,Glob,我一直在将一些shell代码翻译成MS-DOS批处理。在我的代码中,我有以下示例: for %%i in (%*) do set "clargs=!clargs! %%i" 如果输入参数“-?”(不带引号),则不会将其添加到clargs中。我想这是因为“?”是一个通配符。我能做些什么来确保for不做特殊的事情,因为问号位于论点中 @ECHO OFF SETLOCAL SET dummy=%* FOR /f "tokens=1*delims==" %%f IN ('set dummy') DO

我一直在将一些shell代码翻译成MS-DOS批处理。在我的代码中,我有以下示例:

for %%i in (%*) do set "clargs=!clargs! %%i"
如果输入参数“-?”(不带引号),则不会将其添加到clargs中。我想这是因为“?”是一个通配符。我能做些什么来确保for不做特殊的事情,因为问号位于论点中

@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% %*

(毫无疑问,您会希望进一步处理,但是您已经使用了haff vays…

您是正确的,通配符
*
在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批处理脚本的unix样式参数的健壮方法,请参阅。

我同意这是非常愚蠢的--我正在考虑用更好的示例替换它,但这是显示我的意思的最佳行。实际的代码示例现在大约有20行长,我觉得没有必要显示我的意思。我明天会试用这个样品,如果它有效,我会把你的答案标记为正确。谢谢所以我有,它是有效的,但是我如何以类似的方式循环args的值,因为args可以包含“-?”,然后for循环解释args会忽略它。@Sammidysam-Huh?你指的是什么循环?我的答案中没有FOR循环,你的pastebin代码中也没有FOR循环。哦,对不起。我的意思是,这是我的for循环,用于将参数输入程序并解释它们。程序最初将命令行参数拆分为gcc/g++的参数和调用gcc/g++的程序的参数。我是否需要在循环中解释程序的参数,将gcc/g++的库和程序的参数分开?