「for」コマンドにパイプするにはどうすればよいですか?


11

forコマンドにパイプするにはどうすればよいですか。だから代わりに

    C:\asd>ipconfig | findstr "Address" >a

   C:\asd>for /f "tokens=15" %f in (a) do @echo %f
   192.168.1.3

1行でできるようにしたいです。

C:\asd>ipconfig | findstr "Address" | for /f "tokens=15" %f do @echo %f
do was unexpected at this time.

回答:


22

文書化されていないように見えますが、FORコマンド内のコマンドにパイプできます。私は最初にこの例からそれについて学びました:

SC query | FOR /F "tokens=2" %%i IN ('FIND /I "SERVICE_NAME"') DO @ECHO %%i

このコードの変更されたバージョンは機能します。

C:\>ipconfig | for /f "tokens=14" %f in ('findstr "Address"') do @echo %f
192.168.x.x
192.168.y.y

この回答で説明されているように、FORコマンド内で「more」を使用して、任意のコマンドからパイプされた入力を解析することもできます。

C:\>ipconfig | findstr "Address" | for /f "tokens=14" %f in ('more') do @echo %f
192.168.x.x
192.168.y.y

10

ドキュメントを見てfor(実行for /?して確認)、for /fパイプから読み取ることはないと思います。有効なソースは、ファイルセット、「文字列」、および「コマンド」のみです。

FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]

次のforようにコマンドを入れることができます:

for /f "tokens=15" %f in ('ipconfig ^| findstr "Address"') do @echo %f

192.168.x.x
192.168.y.y

(それ^|だけでなくなければならないことを指摘してくれた神経溶解のおかげで|

またはipconfig | findstr "Address"、別のバッチスクリプトを入力して、次のコードを呼び出すこともできます。

for /f "tokens=14" %f in ('ipaddresses') do @echo %f

(スクリプトを呼び出したと想定ipaddresses)。

または、次のようforにして作業を行うこともできますfindstr

for /f "tokens=2,14" %i in ('ipconfig') do @if %i==Address. @echo %j

192.168.x.x
192.168.y.y

IPv6アドレスとは一致しないため、まったく同じではありませんが、これらの行に沿って何かが機能する可能性があります。

また、に変更tokens=15したことにも注意してくださいtokens=14。行の最後のフィールドはトークン14だと思います。とにかくうまくいきます。


私の質問を見ると、一時ファイルの使用について知っていることがわかります。これが私の例で、ファイルを 'a'と呼びました。ただし、最初に言ったことで、パイプを実行するのに最も近いポイントがあります。コマンドを "in"に配置しています。そして、私はそれを行うことができるので、パイプを使用できない理由を説明しているのではないかと思います。パイプを使えないようです。興味深いことに、パイプラインという用語についても触れています。パイプという名前は聞いていませんでしたが、グーグルはそれを示しています。
Barlop、2011年

4
記録のために、「パイプラインをサポートしていないように思われる」理由は、それをエスケープしていないためであり、のfor代わりにパイピングですipconfig。ただ、やるfor /f "tokens=15" %f in ('ipconfig ^| findstr "Address"') do @echo %fときには、^エスケープ文字です。
Matthieu Cartier

神経溶解に感謝します。それを含めるように私の回答を更新します。
ミケル

まあ、以前のように、Forへのパイプを意味しました。しかし、私はそれができないと確信しています。しかし、Mikelの提案のように「中」では可能です。しかし、Mikelのラインを試してみたところ、Mikelのラインで問題が発生しました。そして、あなた(神経溶解)は、パイプをエスケープすることで修正しました。
Barlop '17年

@barlop、はい、一時ファイルの提案を削除します。「パイプライン」は、中央にパイプがある一連のコマンドを意味するUNIX用語です。
Mikel
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.