1

別の変数の名前を含むバッチ変数があります。変数に対して a を実行するCALL ECHOと、期待どおりの出力が得られます。ただし、CALL ECHOコマンドの出力を引数として別のコマンドにパイプしようとすると、問題が発生します。これは私が試みているものです:

@SET myCmd=myCmd -flag1 -flag2
@SET myInnerVar=Bar
@SET myCmdArg="Value of myInnerVar is %%myInnerVar%% for this call"
:: The following correctly prints "Value of myInnerVar is Bar for this call"
@CALL ECHO %myCmdArg%
:: The following runs without passing the output as an argument to myCmd
@CALL ECHO %myCmdArg%| %myCmd%

引数を使用して直接呼び出されたかのように、遅延変数展開を使用して myCmd を呼び出す方法を知っている人はいますか?

@myCmd -flag1 -flag2 "Value of myInnerVar is Bar for this call"

これを実行しようとしている理由は、myCmd を複数回呼び出す必要があるためです。変更されるのは文字列 "Bar" だけです。これは、3 つの変数 (myCmdPre、myInnerVar、および myCmdPost) を使用して、変数の展開を遅らせることなく実行できることを知っています。%myCmdPre%%myInnerVar%%myCmdPost%ただし、 myCmd を実行するたびに入力する必要なく、目標を達成する別の (より簡潔な) 方法が必要なようです。

編集

明確にするために、myCmd.bat という同じディレクトリに次の内容の 2 つ目のバッチ ファイルを作成しました。

@ECHO %*

サンプル バッチ ファイルを実行すると、次のような出力が生成されます。

-flag1 -flag2

myCmd には何もパイプされていないかのようです。

4

1 に答える 1

1

これは同じことを行う別の方法です

@setlocal EnableDelayedExpansion

@SET myCmd=myCmd -flag1 -flag2
@SET Foo=Bar
@SET myCmdArg="Value of Foo is ^!Foo^! for this call"
:: The following correctly prints "Value of Foo is Bar for this call"
@ECHO %myCmdArg%
:: The following runs passing the output as an argument to myCmd
@CMD /V:ON /C ECHO %myCmdArg% | %myCmd%

ここでの問題は、パイプを介して 2 つのプロセスが実行されると、パイプの各側で|の現在の値setlocalが失われるため、各側が遅延展開なしで実行されることです。

編集:以下も機能し、遅延拡張は必要ありません:

@SET myCmd=myCmd -flag1 -flag2
@SET Foo=Bar
@SET myCmdArg="Value of Foo is %%Foo%% for this call"
:: The following correctly prints "Value of Foo is Bar for this call"
@CALL ECHO %myCmdArg%
:: The following runs passing the output as an argument to myCmd
@CALL ECHO %myCmdArg% | %myCmd%

編集

おっと!私は質問の核心を完全に混乱させました!変数の値をバッチ ファイルのAS ARGUMENTに渡したい場合、なぜそれをバッチ ファイルにパイプするのでしょうか。-file1-file2がバッチ ファイルの引数で、 variable の値も引数 (3 番目の引数) にしたい場合は、-file1myCmdArgfile2引数の後に配置します

:: The following runs passing the value of myCmdArg variable as an argument to myCmd
@CALL %myCmd% "%myCmdArg%"
于 2015-06-11T16:16:21.130 に答える