web-dev-qa-db-ja.com

Bashバックティックに相当するバッチ

Bashを使用するとき、あるコマンドの出力を次のように別のコマンドに入れることができます。

my_command `echo Test`

と同じものになります

my_command Test

(明らかに、これは単なる非実用的な例です。)

バッチで同じことができるかどうか疑問に思っています。

88
MiffTheFox

最初に出力をファイルにリダイレクトすることでそれを行うことができます。例えば:

echo zz > bla.txt
set /p VV=<bla.txt
echo %VV%
54
zvrba

for /fコマンドでcmd.exeスクリプトを使用して、同様の機能を取得できます。

for /f "usebackq tokens=*" %%a in (`echo Test`) do my_command %%a

ええ、それはちょっと控えめに言っても(控えめに言っても)、それはそこにあるものです。

厄介な詳細については、for /?を参照してください。

補足:echofor /fの内部コマンドであるため、「cmd.exe /c echo Test」コマンドのバックティック内で「echo」を使用するには「cmd.exe」を使用する必要があると思いましたが、より自然な方法。 Windowsバッチスクリプトは、常に何らかの形で私を驚かせます(通常は良い方法ではありません)。

96
Michael Burr

「for」コマンドのドキュメントを読む:for /?

悲しいことに、私は自分でチェックするためにWindowsにログインしていませんが、このようなものはあなたが望むものに近づけることができると思います:

for /F %i in ('echo Test') do my_command %i
27
Weeble

常に Bash をWindows内で実行できます。 [〜#〜] msys [〜#〜]Cygwin よりもずっと効率的です)でいつもやっています。

3
davr

たぶん、標準のfor /fメソッドの構文を台無しにしていますが、&&と|を含む非常に複雑なコマンドを入力するとfor /fの制限内のバックティック内で、問題が発生します。任意の複雑さのコマンドを処理するために、通常からわずかに変更することができます。

SET VV=some_command -many -arguments && another_command -requiring -the-other -command | handling_of_output | more_handling
for /f "usebackq tokens=*" %%a in (`%VV%`) do mycommand %%a

完全で複雑なコマンドを最初に変数に入れてから、複雑なコマンドをforループの制限に直接入れるのではなく、制限に変数への参照を置くことで、構文解釈の問題を回避できます。現在、上記の例でVV変数に設定した正確なコマンドを使用場所%VV%にコピーすると、構文エラーが発生します。

3
mtalexan