como canalizo para o comando "for"?

11

Como 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.
barlop
fonte

Respostas:

22

Embora não pareça estar documentado, você pode canalizar para o comando dentro do comando FOR. Eu aprendi sobre isso com 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 nesta 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
Adam C
fonte
10

Olhando para a documentação for(corra for /?para vê-la), acho que não for /fserá lido em um pipe. As únicas fontes válidas são o conjunto de arquivos, "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ê pode colocar o comando dentro fordesta maneira:

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 que tem que ser ^|e não apenas |)

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

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

(supondo que você tenha chamado o script ipaddresses).

Ou você pode usar foro trabalho findstrtambé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 pode funcionar.

Observe também que mudei tokens=15para tokens=14. Acho que o último campo da linha é o token 14. Funciona para mim de qualquer maneira.

Mikel
fonte
Se você olhar para a minha pergunta, verá que eu sei sobre o uso de um arquivo temporário, esse foi o meu exemplo, acabei de chamar o arquivo 'a'. Com o que você diz no início, você tem um ponto, o mais próximo de fazer o pipe .. é colocar o comando no "in". E suponho que, como se pode fazer isso, isso possa explicar por que não se pode usar um cachimbo para isso. Parece que não se pode usar um cachimbo nele. Interessante também mencionar o termo pipeline ... eu não tinha ouvido o cachê chamar isso ... mas um google mostra isso.
barlop
4
Para constar, o motivo pelo qual "parece não suportar canais" é simplesmente porque você não escapou, é canalização em forvez de ipconfig. Apenas faça for /f "tokens=15" %f in ('ipconfig ^| findstr "Address"') do @echo %f, quando ^é o caractere de escape.
Matthieu Cartier
Obrigado neurólise, atualizará minha resposta para incluir isso.
Mikel
Bem, eu quis dizer canalizar para o For, como antes. Mas estou convencido de que não podemos. Mas pode no "in" como na sugestão de Mikel. Mas, tentando a linha de Mikel, eu tive um problema com a linha de Mikel ... e você (neurólise) corrigiu isso escapando do cano.
barlop
@ Barlop, sim, vou remover a sugestão do tempfile. "pipeline" é um termo UNIX que significa uma série de comandos com pipes no meio.
Mikel