【问题标题】:cmd for loop escape ? in set?cmd for 循环转义?在集合?
【发布时间】:2012-11-24 13:23:23
【问题描述】:

有没有办法在 for 循环中转义问号,以便以下操作?

for %%a in (%*) do (
for %%b in (/? /h /help -h -help --help) do if %%a==%%b goto usage
)

它会比单独的 if 干净得多。在单独的 if 子句中 %%a==/^?工作,但不在这里。

【问题讨论】:

    标签: windows for-loop batch-file cmd wildcard


    【解决方案1】:

    没有办法保留通配符 * ?在 FOR (no /F) 命令中,唯一的方法是通过 FOR /F。请注意,在这种情况下,两个 FOR 都存在问题,因此此解决方案也不起作用:

    for %%a in (%*) do (
       if %%a == /? goto usage
       if %%a == /h goto usage
       . . . .
    )
    

    ...当然,除非那个 /?参数没有给出。

    虽然可以组装一个循环来迭代包括 /? 在内的多个开关,但生成的代码比单个 IF 更复杂。你可以试试这个解决方案:

    setlocal EnableDelayedExpansion
    
    set params=%*
    if "%params:/?=%" neq "%params%" goto usage
    for %%b in (/h /help -h -help --help) do if "!params:%%b=!" neq "%params%" goto usage
    

    【讨论】:

    • 这是一个很好的、有效的解决方案,除非参数为空,if 给出“此时 goto 是意外的。”,想知道为什么?加了if [%1]==[] goto usage先检查无参数就好了。
    • 是的,但是这样写:if "%1" == "" goto usage。这是执行此操作的标准方法...
    • 不错的解决方法!至于if "%1" == "",如果%1本身用双引号括起来,可能效果不好。 if "%~1" == "" 可能会更好。
    【解决方案2】:

    除了当 %* 为空时“params”变通方法失败:如果在 %* 前加上空格:set params= %*%params:/?=%" 中它不会为空,并且比较不会失败。

    【讨论】:

      猜你喜欢
      • 2015-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-25
      • 2010-10-31
      相关资源
      最近更新 更多