¿Cómo puedo canalizar el comando "for"?

11

¿Cómo canalizo al comando for? Entonces en lugar de

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

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

Me gustaría poder hacerlo en una línea.

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

Respuestas:

22

Aunque no parece estar documentado, puede canalizar el comando dentro del comando FOR. Lo aprendí por primera vez de este ejemplo :

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

Esta versión modificada de su código funciona:

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

También puede usar "más" dentro del comando FOR, como se describe en esta respuesta , para analizar la entrada canalizada desde 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
Adam C
fuente
10

Mirando la documentación para for(ejecutar for /?para verla), no creo for /fque lea de una tubería. Las únicas fuentes válidas son el conjunto de archivos, "cadena" y '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]

Podría poner el comando dentro de la forsiguiente manera:

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

192.168.x.x
192.168.y.y

(gracias a la neurólisis por señalar que tiene que ser ^|y no solo |)

O puede intentar poner ipconfig | findstr "Address"un script por lotes separado y llamar:

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

(suponiendo que llamó al guión ipaddresses).

O también podría forhacer el trabajo de findstresta manera:

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

192.168.x.x
192.168.y.y

no es lo mismo porque no coincidirá con las direcciones IPv6, pero algo en ese sentido podría funcionar.

También tenga en cuenta que me cambié tokens=15a tokens=14. Creo que el último campo en la línea es el token 14. De todos modos, me funciona.

Mikel
fuente
Si miras mi pregunta, verás que sé sobre el uso de un archivo temporal, ese fue mi ejemplo, acabo de llamar al archivo 'a'. Sin embargo, con lo que dices al principio, tienes un punto, lo más cercano a hacer la tubería ... es poner el comando en "in". Y supongo que dado que uno puede hacer eso, eso podría explicar por qué no se puede usar una tubería para. Parece que no se puede usar una tubería. Interesante también mencionas el término canalización ... No había escuchado que la tubería se llamara así ... pero un google lo muestra.
barlop
44
Para el registro, la razón por la que "no parece apoyar las tuberías" es simplemente porque no se han escapado de ella, que esté bien foren lugar de ipconfig. Solo hazlo for /f "tokens=15" %f in ('ipconfig ^| findstr "Address"') do @echo %f, cuando ^es el personaje de escape.
Matthieu Cartier
Gracias neurólisis, actualizaré mi respuesta para incluir eso.
Mikel
Bueno, me refería a For, como antes. Pero estoy convencido de que uno no puede. Pero puede en el "en" como en la sugerencia de Mikel. Pero al probar la línea de Mikel, me encontré con un problema con la línea de Mikel ... y usted (neurólisis) lo solucionó escapando de la tubería.
barlop
@barlop, sí, eliminaré la sugerencia del archivo temporal. "tubería" es un término UNIX que significa una serie de comandos con tuberías en el medio.
Mikel