como eu canalizo para o comando “for”?

8

Como eu canalizo para o comando for. Então, ao invés de

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

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

Eu gostaria de poder fazer isso em uma linha.

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

2 respostas

17

Embora não pareça ser documentado, você pode canalizar para o comando dentro do comando FOR. A primeira vez que aprendi sobre isso foi este exemplo :

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

Esta versão modificada do seu código funciona:

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

Você também pode usar "more" dentro do comando FOR, conforme descrito em esta resposta , para analisar a entrada canalizada de um comando arbitrário:

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

Examinando a documentação de for (execute for /? para ver), não acho que for /f lerá de um pipe. As únicas fontes válidas são file-set, "string" e "command".

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]

Você poderia colocar o comando dentro do for assim:

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

192.168.x.x
192.168.y.y

(graças à neurólise por apontar, tem que ser ^| e não apenas | )

Ou você pode colocar ipconfig | findstr "Address" em um script em lote separado e chamar:

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

(assumindo que você chamou o script ipaddresses ).

Ou você pode usar for para fazer o trabalho de findstr também, assim:

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

192.168.x.x
192.168.y.y

não é exatamente o mesmo porque não corresponde aos endereços IPv6, mas algo nesse sentido poderia funcionar.

Observe também que alterei tokens=15 para tokens=14 . Eu acho que o último campo na linha é token 14. Funciona para mim de qualquer maneira.

    
por 17.01.2011 / 00:46