9

バッチファイルでパイプから読み取ることができるかどうか疑問に思っていました。私が書く場合:

echo Test

当然のことですが、Test. それはすばらしい。しかし、出力をパイプして別のコマンドから読み取りたい場合はどうすればよいでしょうか?

echo Test | echo ???

以前と同じ結果を得る方法はありますが、パイプを介していますか? ありがとう!

編集:私が本当に求めているのはこれです。

ファイルのリストがあり、このリストをfilter.txt. だから私は使用する必要がありますfindstr /g:filter.txt

しかし、一致するリストファイルに対して何かをする必要があり、findstrファイルごとに1行を返すため、一致を1行ずつ読み取る必要があります。

これが私がやった方法です:

dir /b | findstr /g:filter.txt | for /F "delims=" %a in ('more') do del "%a"

解決:

私がやりたかったことは、パイプから読み取るのではなく、バッチ ファイル内の別のコマンドの出力を読み取ることだったようです。

1行の読み取りを行うには、次を使用できます。

echo Test | ( set /p line= & call echo %%line%%)

または、複数行の入力でも機能するこれを使用できます。

echo Test | for /F "delims=" %a in ('more') do @echo %a

(さらに使用するこのトリックは、状況によっては役立つ場合があります)。しかし、私の特定のケースでは、解決策は次のとおりです。

for /F "delims=" %a in ('echo Test') do @echo %a

みんなありがとう!

4

4 に答える 4

8

この回答https://stackoverflow.com/a/6980605/1630171に基づいて、私の質問に答える方法は次のようになります。

echo Test | for /F "delims=" %a in ('more') do @echo %a

少し奇妙ですが、うまくいきます:)

これに対するネイティブな解決策がないことは、私には少し奇妙に見えます...しかし、これはまさに私が望んでいることです!

于 2012-11-13T22:59:47.653 に答える
7

1 行を読み取るには、 も使用できますがset /p、これは 1 行でしか機能しません。

echo test | ( set /p line= & call echo %%line%%)

問題は、パイプがそれぞれの側に 2 つの新しい cmd.exe コンテキストを作成することです。
親の cmd.exe と同じウィンドウで実行されます。親の cmd の変数は子のみであるため、変更できません。

これが失敗の原因

echo test | set /p line=
echo %line%

line設定されますが、パイプが終了すると破棄されます。

于 2012-11-13T23:21:03.110 に答える
7

すみません、ここで混乱があると思います...

あなたはパイプから読みたいと言った。パイプは、あるコマンドの出力を別のコマンドの入力にリダイレクトするために使用されます。2 番目のコマンドはfilterと呼ばれます。たとえば、

dir /b | findstr /g:filter.txt

dirとコマンドの間にはパイプがありfindstrます。パイプは常に 2 つのプロセス間で確立されます。dirコマンドからコマンドへと流れるデータを読み取る方法はありませんfindstr(ここに存在する唯一のパイプです)。ただし、コマンドの出力から読み取ることはできますfindstr

追加のフィルターを挿入しても、動作は同じです。たとえば、

dir /b | findstr /g:filter.txt | more

2 つのパイプがありますが、それらのいずれからも読み取る方法はありません。ただし、最後のコマンドの出力から読み取ることができます (moreこの場合)。1 つのコマンドの出力を読み取るためのネイティブ Batch ソリューションは何ですか? FOR /F コマンドです。たとえば、echoコマンド出力を取得するネイティブな方法は次のとおりです。

echo Test | for /F "delims=" %a in ('more') do @echo %a

は:

for /F "delims=" %a in ('echo Test') do @echo %a

echo最初の例では、%a パラメータはとforコマンドの間に存在するパイプから情報を取得するのではなく、コマンドの出力から情報を取得することに注意してくださいmore

同様に、このタスクを達成するための自然な方法は次のとおりです。

dir /b | findstr /g:filter.txt | for /F "delims=" %a in ('more') do del "%a"

この方法です:

for /F "delims=" %a in ('dir /b ^| findstr /g:filter.txt') do del "%a"

コマンドの複数行出力を処理しますfindstr

2 番目の方法は、前者よりも高速であるだけでなく、more実際には何もしないコマンドを含めると、望ましくない誤解やエラーが発生する可能性があるため、より明確です。

アントニオ

于 2012-11-15T04:50:39.933 に答える