Wie leite ich zum Befehl "for"?

11

Wie leite ich zum for-Befehl. Also statt

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

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

Ich würde es gerne in einer Zeile tun können.

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

Antworten:

22

Obwohl es nicht dokumentiert zu sein scheint, können Sie innerhalb des FOR-Befehls zum Befehl weiterleiten. Ich habe es zuerst anhand dieses Beispiels gelernt :

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

Diese modifizierte Version Ihres Codes funktioniert:

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

Sie können auch "more" innerhalb des FOR-Befehls verwenden, wie in dieser Antwort beschrieben , um Eingaben zu analysieren, die von einem beliebigen Befehl eingespeist wurden:

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

Wenn ich mir die Dokumentation für for(Ausführen for /?, um sie zu sehen) ansehe, denke ich nicht, dass for /fsie aus einer Pipe gelesen wird. Die einzigen gültigen Quellen sind Dateisatz, "Zeichenfolge" und "Befehl".

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]

Sie können den Befehl forwie folgt eingeben :

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

192.168.x.x
192.168.y.y

(Dank der Neurolyse für den Hinweis, dass es sein muss ^|und nicht nur |)

Oder Sie können versuchen, ipconfig | findstr "Address"ein separates Batch-Skript einzufügen und Folgendes aufzurufen:

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

(vorausgesetzt, Sie haben das Skript aufgerufen ipaddresses).

Oder Sie könnten forauch die Arbeit von findstrso machen:

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

192.168.x.x
192.168.y.y

Es ist nicht ganz dasselbe, da es nicht mit IPv6-Adressen übereinstimmt, aber etwas in dieser Richtung könnte funktionieren.

Beachten Sie auch, dass ich zu geändert tokens=15habe tokens=14. Ich denke, das letzte Feld in der Zeile ist Token 14. Funktioniert sowieso für mich.

Mikel
quelle
Wenn Sie sich meine Frage ansehen, werden Sie sehen, dass ich über die Verwendung einer temporären Datei Bescheid weiß. Dies war mein Beispiel. Ich habe die Datei nur 'a' genannt. Mit dem, was Sie zu Beginn sagen, haben Sie einen Punkt, der der Pipe am nächsten kommt. Setzen Sie den Befehl in das "In". Und ich nehme an, da man das kann, könnte das erklären, warum man keine Pfeife dafür verwenden kann. Es sieht so aus, als könnte man kein Rohr dazu benutzen. Interessanterweise erwähnen Sie auch den Begriff Pipeline. Ich hatte nicht gehört, dass die Pipe so heißt. Aber ein Google zeigt es.
Barlop
4
Für die Aufzeichnung ist der Grund, warum es "keine Pipelines zu unterstützen scheint", einfach, weil Sie nicht entkommen sind, es ist Piping forstatt ipconfig. Tun Sie einfach for /f "tokens=15" %f in ('ipconfig ^| findstr "Address"') do @echo %f, wann ^der Fluchtcharakter ist.
Matthieu Cartier
Danke Neurolyse, werde meine Antwort aktualisieren, um das einzuschließen.
Mikel
Nun, ich wollte nach For leiten, wie zuvor. Aber ich bin überzeugt, dass man nicht kann. Kann aber im "in" wie in Mikels Vorschlag. Aber als ich Mikels Leitung ausprobierte, stieß ich auf ein Problem mit Mikels Leitung. Und Sie (Neurolyse) haben das behoben, indem Sie aus der Leitung entkommen sind.
Barlop
@barlop, ja, ich werde den Tempfile-Vorschlag entfernen. "Pipeline" ist ein UNIX-Begriff, der eine Reihe von Befehlen mit Pipes in der Mitte bedeutet.
Mikel