5

我正在尝试获得与以下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 在批处理文件的循环内也有效的东西的奖励积分。

4

2 回答 2

4

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

  setlocal enabledelayedexpansion
  set FOO=foo.bar
  set BAR=bar
  set BAZ=baz

  echo !FOO:%BAR%:%BAZ%!

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

于 2012-08-28T10:29:58.810 回答
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块内设置用于替换的变量,您可以进一步简化它。

于 2012-08-28T11:46:07.427 回答