comment puis-je diriger vers la commande "for"?

11

Comment puis-je diriger vers la commande for. Donc au lieu de

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

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

Je voudrais pouvoir le faire sur une seule ligne.

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

Réponses:

22

Bien qu'il ne semble pas être documenté, vous pouvez diriger vers la commande à l'intérieur de la commande FOR. J'ai d'abord appris cela à partir de cet exemple :

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

Cette version modifiée de votre code fonctionne:

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

Vous pouvez également utiliser "plus" à l'intérieur de la commande FOR, comme décrit dans cette réponse , pour analyser l'entrée canalisée à partir d'une commande arbitraire:

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

En regardant la documentation de for(courez for /?pour le voir), je ne pense pas que for /flira à partir d'un tuyau. Les seules sources valides sont l'ensemble de fichiers, la "chaîne" et la "commande".

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]

Vous pouvez mettre la commande à l'intérieur forcomme ceci:

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

192.168.x.x
192.168.y.y

(merci à la neurolyse de l'avoir souligné ^|et pas seulement |)

Ou vous pouvez essayer de mettre ipconfig | findstr "Address"un script batch séparé et d'appeler:

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

(en supposant que vous avez appelé le script ipaddresses).

Ou vous pouvez aussi utiliser forpour faire le travail findstr, comme ceci:

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

192.168.x.x
192.168.y.y

ce n'est pas tout à fait la même chose car il ne correspondra pas aux adresses IPv6, mais quelque chose dans ce sens pourrait fonctionner.

Notez également que j'ai changé tokens=15pour tokens=14. Je pense que le dernier champ de la ligne est le jeton 14. Ça marche pour moi quand même.

Mikel
la source
Si vous regardez ma question, vous verrez que je sais comment utiliser un fichier temporaire, c'était mon exemple, je viens d'appeler le fichier «a». Cependant, avec ce que vous dites au début, vous avez un point, le plus proche de faire le tuyau .. est de mettre la commande dans le "in". Et je suppose que puisque l'on peut le faire, cela pourrait expliquer pourquoi on ne peut pas utiliser de pipe pour for. Il semble que l'on ne puisse pas y utiliser de tuyau. Interestin aussi vous mentionnez le terme pipeline .. Je n'avais pas entendu le tuyau appeler ça .. mais un google le montre.
barlop
4
Pour mémoire, la raison pour laquelle il "ne semble pas prendre en charge les pipelines" est simplement parce que vous ne l'avez pas échappé, c'est forplutôt de la canalisation ipconfig. Faites juste for /f "tokens=15" %f in ('ipconfig ^| findstr "Address"') do @echo %f, quand ^est le personnage d'échappement.
Matthieu Cartier
Merci neurolyse, mettra à jour ma réponse pour l'inclure.
Mikel
Eh bien, je voulais parler de For, comme avant. Mais je suis convaincu qu'on ne peut pas. Mais peut dans le "in" comme dans la suggestion de Mikel. Mais en essayant la lignée de Mikel, j'ai rencontré un problème avec la lignée de Mikel .. et vous (neurolyse) avez résolu cela en vous échappant du tuyau.
barlop
@barlop, oui, je supprimerai la suggestion de tempfile. "pipeline" est un terme UNIX signifiant une série de commandes avec des tuyaux au milieu.
Mikel