【问题标题】:CMD variable substitution for parameters参数的 CMD 变量替换
【发布时间】:2012-08-28 08:21:04
【问题描述】:

我正在尝试获得与以下 bash 功能等效的 CMD:

$ FOO=foo.bar
$ BAR=bar
$ BAZ=baz
$ echo ${FOO/$BAR/$BAZ}
foo.baz

现在,当模式和替换都为时,CMD 有一些类似的命令替换 常量:

C:\>set FOO=foo.bar
C:\>set BAR=bar
C:\>set BAZ=baz
C:\>echo %FOO:bar=baz%
foo.baz

但是,我似乎无法在其中引用变量 -

C:\>echo %FOO:%BAR%=%BAZ%%
%foo:bar=baz%

我该怎么做?指出在批处理文件中的 FOR 循环中也有效的东西的奖励积分。

【问题讨论】:

    标签: windows shell cmd


    【解决方案1】:

    以下(批处理文件)应该可以工作并打印“foo.baz”:

      setlocal enabledelayedexpansion
      set FOO=foo.bar
      set BAR=bar
      set BAZ=baz
    
      echo !FOO:%BAR%:%BAZ%!
    

    (关于你提到的 FOR 循环的事情,你需要提供更多关于你的意思的信息。)

    【讨论】:

    • 谢谢,这在循环中也有效(幸运的是,我的 %BAR% 和 %BAZ% 值在循环中是稳定的......)。
    【解决方案2】:

    从命令行:
    call echo %FOO:%bar%=%baz%%

    批处理和for循环:

    @echo off
      set FOO=foo.bar
      set BAR=bar
      set BAZ=baz
    for %%N in (baz ban bak) do (
     set BAZ=%%N_AndSomething
     call :expand 
    )
    goto :eof
    
    :expand
    call echo %%FOO:%BAR%=%BAZ%%%
    goto :eof
    

    您可以通过使用延迟扩展而不是第二次调用来优化它(调用很昂贵),但这已经展示了,所以我把它作为语法示例。如果您不需要在 for 块内设置用于替换的变量,您可以进一步简化它。

    【讨论】:

    • 感谢您向我展示如何使用 CALL 插入变量!
    猜你喜欢
    • 2013-05-23
    • 2016-06-27
    • 2014-04-19
    • 1970-01-01
    • 2019-10-19
    • 2014-09-11
    • 2022-01-15
    • 1970-01-01
    • 2013-05-05
    相关资源
    最近更新 更多