come posso eseguire il pipe al comando "for"?


11

Come installo il comando for. Quindi invece di

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

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

Vorrei poterlo fare su una sola riga.

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

Risposte:


22

Anche se non sembra essere documentato, è possibile reindirizzare al comando all'interno del comando FOR. L'ho imparato per la prima volta da questo esempio :

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

Questa versione modificata del codice funziona:

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

Puoi anche usare "altro" all'interno del comando FOR, come descritto in questa risposta , per analizzare l'input inserito da un comando arbitrario:

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

10

Guardando la documentazione di for(corri for /?a vederlo), non credo for /fche leggerà da una pipa. Le uniche fonti valide sono set di file, "stringa" e "comando".

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]

Potresti inserire il comando all'interno di forquesto modo:

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

192.168.x.x
192.168.y.y

(grazie alla neurolisi per aver sottolineato che deve essere ^|e non solo |)

Oppure potresti provare a inserire ipconfig | findstr "Address"uno script batch separato e chiamare:

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

(supponendo che tu abbia chiamato la sceneggiatura ipaddresses).

Oppure potresti usare anche forper fare il lavoro findstr, in questo modo:

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

192.168.x.x
192.168.y.y

non è esattamente lo stesso perché non corrisponderà agli indirizzi IPv6, ma qualcosa del genere potrebbe funzionare.

Nota anche che sono passato tokens=15a tokens=14. Penso che l'ultimo campo sulla linea sia il token 14. Funziona comunque per me.


Se guardi la mia domanda, vedrai che so di usare un file temporaneo, quello era il mio esempio, ho appena chiamato il file 'a'. Con quello che dici all'inizio, hai un punto, il più vicino a fare la pipe .. sta mettendo il comando in "in". E suppongo che dal momento che uno può farlo, ciò potrebbe spiegare perché non si può usare una pipa per. Sembra che non si possa usare una pipa. Anche per Interestin hai citato il termine pipeline .. Non avevo sentito la pipa chiamarla così ... ma un google lo mostra.
barlop

4
Per la cronaca, il motivo per cui "non sembra supportare le pipeline" è semplicemente perché non l'hai evitato, è forinvece il piping ipconfig. Basta for /f "tokens=15" %f in ('ipconfig ^| findstr "Address"') do @echo %f, quando ^è il personaggio di fuga.
Matthieu Cartier,

Grazie neurolisi, aggiornerò la mia risposta per includerla.
Mikel,

Beh, intendevo convogliare a For, come prima. Ma sono convinto che non si possa. Ma può nel "in" come nel suggerimento di Mikel. Ma provando la linea di Mikel, ho riscontrato un problema con la linea di Mikel .. e tu (neurolisi) hai risolto il problema sfuggendo alla pipa.
barlop

@barlop, sì, rimuoverò il suggerimento tempfile. "pipeline" è un termine UNIX che significa una serie di comandi con pipe al centro.
Mikel,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.