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

2番目の呼び出しの代わりに遅延拡張を使用して最適化することもできます(呼び出しは高価です)が、それはすでに示されているので、構文の例として残しました。ブロック内の置換で使用される変数を設定する必要がない場合はfor、さらに簡略化できます。

于 2012-08-28T11:46:07.427 に答える