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


97

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

my_command `echo Test`

と同じものになります

my_command Test

(明らかに、これは非実用的な例にすぎません。)

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


回答:


53

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

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

16
一時ファイルを保存するための書き込みアクセス権がある場所を見つける必要があります。あなたは自分の後を片付ける必要があります。このまさにこの例では、入力の最初の行のみを読み取ることができます。すべての実用的な目的のために、for /fバリアントははるかに優れています。
ジョーイ

@grawity-とともに%random%
bacar

1
@joey各行を読み取りますが、単一のコマンドでコマンドライン引数に連結する方法。
user877329 2014年

改行はどのように処理されますか?
アンドリューク2017年

103

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

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

ええ、それは(控えめに言っても)ちょっと自明ではありませんが、そこにあるものです。

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

追記:私は「使用することを考えたecho」のバッククォートの内側に「for /f」コマンド「が使用して行われる必要があるcmd.exe /c echo Testため、」echo内部コマンドであるcmd.exeが、それは、より自然な方法で動作します。Windowsバッチスクリプトは常に何らかの形で私を驚かせます(ただし、通常は良い方法ではありません)。


2
自動的にシェルを生成しない外部プログラムからシェルビルドを実行する場合は、通常、これを行う必要があります。system()つまり、C は問題ありませんでした。iircは、シェルをProcess.Start起動しますが、.NET は明示的にシェルを呼び出す必要があるためです。そのようなもの、iirc。いずれにせよ、これは受け入れられた答えよりも良い答えだと思います:-)
Joey

2
for害はしないが問題を混乱させるオプション。これはどうですか:for /f %%a in ('"echo Test"') do my_command %%a
エヴァンハース

9
バッチスクリプトではなくコマンドラインで同じことを実行するときは、%%ではなく単一の%を使用します。
jsears 2014

2
">"演算子などのパイピングではうまく機能しないようです。しかし、そうでなければ、これは素晴らしいです。これが%と%%の問題だったのでない限り。
ジョナサン

3
@エヴァン:tokens=*重要です。それ以外の場合、コマンドの結果にスペースが含まれていると、最初の単語のみが出力されます。これをプロンプトで実行しますfor /f %a in ('"echo foo bar"') do echo "%a"。印刷されます"foo"
Dan Dascalescu 2014年

29

「for」コマンドのドキュメントを読みます。 for /?

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

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

6
他の誰かがこれにつまずいた場合、コマンドがバッチファイル(* .bat)から実行されるとき、両方の%i変数は二重パーセント記号である必要があります:%% i。
mgouin 2017年

3

Bashは常にWindows内で実行できます。私はいつもMSYSでそれをしています(Cygwinよりはるかに効率的です)。


残念ながら、MSYSは現在ほとんどメンテナンスされておらず、最新のbashを取得するには、個別にインストールする必要があります
Ed Randall

1
BusyBoxはさらに小さくなります(〜432KB)。完全なバッシュではありませんが、アッシュだけです。ここで非公式のWindowsポートを取得:frippery.org/busybox
Martin

3

多分私は標準的な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%と、構文エラーが発生します。


1
これは私にとってはうまくいきませんでしたが、カラット(^)でエスケープすると、forコマンド内で直接パイプできることがわかりました:for / f "usebackq tokens = *" %% a in( `command ^ | command`)do command %% a
Heptite

@Heptiteカードのエスケープは機能しませんでしたが、二重引用符で囲まれたコマンドラインは機能しました。
Alexandr Zarubkin 16

@Heptite私の場合、事前に実行する必要がある一連のコマンドがわからなかったため、ある場合にはファイルから抽出され、別の場合には渡されました。エスケープでは、実行するインタープリターの数に基づいてコマンドをエスケープする回数を知る必要があります。私のユースケースでは、インタープリターの数が一貫していませんでした。
mtalexan 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.