batch file:在for循环中转义问号

这个for循环(简化的例子);

@echo off for %%a in (help -help --help /help ? /?) do ( echo %%a ) 

扼stream圈上的2个元素用'?' 字符。 它输出

 C:\Temp>test.bat help -help --help /help C:\Temp> 

所以当它碰到第一个“?”时就会退出循环。

这组合适的转义序列是什么? 尝试了一堆东西,双引号,插入符号,反斜杠等,但似乎没有工作。

Solutions Collecting From Web of "batch file:在for循环中转义问号"

另一种选择是在FOR / F字符串中使用换行符。 FOR / F会将每行视为一个独立的字符串。 下面我展示了四种方法来做同样的事情。

 @echo off setlocal enableDelayedExpansion :: Define LF to contain a linefeed character set ^"LF=^ ^" The above empty line is critical. DO NOT REMOVE :: Option 1 :: Embed linefeeds directly in the string literal for /f %%A in ("help!LF!-help!LF!--help!LF!/help!LF!?!LF!/?") do ( echo(%%A ) echo( :: Option 2 :: Define a variable with spaces and use search and replace :: to substitue linefeeds set "help=help -help --help /help ? /?" for %%L in ("!LF!") do for /f %%A in ("!help: =%%~L!") do ( echo(%%A ) echo( :: Option 3 :: Embed linefeed directly in string without LF variable for /f %%A in (^"help^ -help^ --help^ /help^ ?^ /?^") do ( echo(%%A ) echo( :: Option 4 :: Embed linefeed directly in search and replace without LF variable for /f %%A in (^"!help:^ ^=^ !^") do ( echo(%%A ) 

我更喜欢选项2.我觉得它是最简单的阅读,但仍然是紧凑的。

请注意,MC ND和I都使用echo(%%A这是防止echo /?显示ECHO命令的帮助所必需的。

没有什么似乎工作,因为没有任何工作。

以最简单的形式( for %%x in (set) do ... ),当for命令遍历集合中的元素时,它将测试元素是否包含*或者? 。 在这种情况下,它被认为是一个文件通配符,并将搜索匹配指定表达式的文件。 你可以在包含批处理文件的文件夹中放置一个带有单个字符名称但没有扩展名的文件来测试它, 将匹配它,你会看到它在输出。

据我所知,没有办法避免它。 这是命令意图工作的方式。

你可以构建类似于你正在尝试的东西,但需要另一种方法

 @echo off setlocal set "opt.a=help" set "opt.b=-help" set "opt.c=--help" set "opt.d=/help" set "opt.e=?" set "opt.f=/?" for /f "tokens=2 delims==" %%a in ('set opt.') do ( echo(%%a ) endlocal 

在这个示例中,每个值都在一个环境变量中,并且通过set命令检索set并使用for命令的选项处理输出。 这只是一个选择。 你需要这些值作为行分隔的字符串来处理一个for /f

如果你使用一个for /f循环,它的工作原理并不是逃避? 字符,虽然循环不能以相同的方式工作:

 C:\Users\Alex\Downloads\test>for /f "tokens=* delims=" %a in ('echo help -help --help /help ? /?') do echo %a C:\Users\Alex\Downloads\test>echo help -help --help /help ? /? help -help --help /help ? /?