Est-il possible dans un fichier de commandes pour lire à partir d'un tuyau, ligne par ligne?
Je me demandais si il est possible de lire à partir d'un tuyau dans un fichier de commandes. Si j'écris:
echo Test
- je obtenir, rien de surprenant, Test
. C'est gentil. Mais que faire si je veux rediriger la sortie, et de le lire à partir d'une autre commande?
echo Test | echo ???
Comment faire pour obtenir le même résultat qu'avant, mais par l'intermédiaire d'un tuyau?
Merci!
EDIT: ce que je suis après vraiment après est-ce.
J'ai une liste de fichiers, et j'ai besoin de filtrer cette liste avec les quelques mots que j'ai mis, ligne par ligne dans un fichier nommé filter.txt
. J'ai donc utiliser findstr /g:filter.txt
.
Mais là j'ai besoin de faire quelque chose à la liste des fichiers qui correspond, et depuis findstr
retourne une ligne pour chaque fichier, je dois lire les matchs ligne par ligne.
C'est la façon dont je l'ai fait:
dir /b | findstr /g:filter.txt | for /F "delims=" %a in ('more') do del "%a"
SOLUTION:
Il semble que ce que je voulais faire n'était pas lecture à partir d'un tuyau mais juste la lecture de la sortie d'une autre commande dans un fichier de commandes.
À faire une seule ligne de lecture, vous pouvez utiliser ceci:
echo Test | ( set /p line= & call echo %%line%%)
ou vous pouvez utiliser cette fonction, qui fonctionne également avec une entrée multi-ligne:
echo Test | for /F "delims=" %a in ('more') do @echo %a
(cette astuce de l'aide plus pourrait être utile dans certaines situations). Mais dans mon cas particulier, la solution est: est-ce
for /F "delims=" %a in ('echo Test') do @echo %a
Merci à tout le monde!
j'ai vu cette question, mais je ne savais pas que c'était utile... mais on dirait qu'il est! merci!
Vous êtes les bienvenus.
OriginalL'auteur fthiella | 2012-11-13
Vous devez vous connecter pour publier un commentaire.
Excusez-moi, je pense qu'il y a une confusion ici...
Vous avez dit que vous voulez lire à partir d'un tuyau. Un tuyau est utilisé pour rediriger la sortie d'une commande vers l'entrée d'une autre commande; la deuxième commande est appelée filtre. Par exemple, dans
il y a un tube entre
dir
etfindstr
commandes. Un tuyau est toujours établi entre les deux processus. Il n'y a aucun moyen de lire les données qui en découlentdir
commande pourfindstr
de commande (c'est le seul tuyau qui existent ici). Toutefois, vous pouvez lire la sortie defindstr
commande.Si l'on insère un filtre supplémentaire, le comportement est le même. Par exemple, dans
il y a deux tuyaux, mais il est impossible de lire à partir de quiconque d'entre eux. Toutefois, vous pouvez lire à partir de la sortie de la dernière commande (
more
dans ce cas). Qu'est-ce que le natif de Lot de la solution à lire la sortie d'une commande? C'est la commande /F. Par exemple, le natif de façon à obtenirecho
de sortie de la commande dans:est:
Veuillez noter que dans le premier exemple, l' %un paramètre de ne PAS obtenir l'information de la pipe qui existent entre
echo
etfor
commandes, mais à partir de la sortie demore
commande.De la même manière, la méthode naturelle pour réaliser cette tâche:
est de cette façon:
que les processus multi-ligne de sortie de
findstr
commande.Deuxième méthode n'est pas seulement plus rapide que l'ancien, mais il est aussi plus clair parce que l'inclusion d'un
more
commande qui vraiment ne rien faire peut avoir des conséquences indésirables des idées fausses ou des erreurs.Antonio
oui, vous avez raison... je me sens un peu confus 🙂 mais j'ai cette réponse explique tout, l'autre réponse a également été utile, mais cette solution est ce que je cherchais! merci beaucoup!
OriginalL'auteur Aacini
Basé sur cette réponse https://stackoverflow.com/a/6980605/1630171 il semble que l'une des façons de répondre à ma question est: est-ce
C'est un peu bizarre, mais ça fonctionne 🙂
Il ne semble un peu étrange pour moi qu'il n'y a pas de solution native pour cela... mais ce n'est exactement ce que je veux!
"delims="
POUR l'option au lieu de"tokens=*"
pour obtenir des lignes entières. La deuxième méthode consiste à supprimer les espaces avant le premier jeton...merci pour votre suggestion....j'ai mis à jour ma réponse!!
La question est: Que voulez-vous atteindre? Résoudre un problème concret ou pour obtenir un agréable solution
je vais mettre à jour ma question... je ne dis pas que cette solution n'est pas agréable, en fait, je crois que c'est! merci encore! c'est seulement que je me sens un peu surpris qu'il n'y a pas de "native" solution à ce...
pas de problème! Je crois qu'il est préférable de donner à la personne qui a envoyé la réponse 1-2 jours pour poster comme "officiel", après quoi vous pouvez (si vous aimez la réponse) marquer comme "Accepté". Après les 1-2 jours, bien que, dans mon esprit, il est évident qu'ils sont allés sur leur petit bonhomme de chemin répondre à d'autres questions. Sans les 1-2 jours "de" période de grâce, si, il peut paraître un peu, euh... les courbes d'Apprentissage peut être amusant - espérons que cette une est ok. 🙂 (BTW, j'ai appris BEAUCOUP sur!!)
OriginalL'auteur fthiella
Pour lire une seule ligne, vous pouvez également utiliser
set /p
, mais cela ne fonctionne qu'avec une seule ligne.Le problème est ici, qu'un tuyau crée deux nouvelles cmd.exe contextes, de chaque côté, une.
Ils courent dans la même fenêtre que le parent cmd.exe, ils ne peuvent pas changer toutes les variables de la mère cmd, comme ils ne sont childs.
Qui en est la cause pourquoi celui-ci ne parvient pas
line
sera fixé, mais il sera détruit lorsque les extrémités des tubes.Mais votre multiligne échantillon est très court, je crois qu'il n'y a pas un moyen plus court.
vous avez raison, merci pour votre commentaire, mon exemple n'est pas multiligne... mais je ne savais pas qu'il y avait deux solutions différentes, l'un d'une seule ligne, un pour multiligne...
Cela a fonctionné! Ce qui m'intrigue, c', parce que... Avez-vous déjà essayé de courir tout simplement
Echo test | set /p line=
? Elle n'a jamais travaillé pour moi et je ne peux pas comprendre pourquoi votre extrait de code fonctionne, et la mienne ne l'est pas. Je veux dire, je neset line=
, puis exécutez le tuyau, puis faireecho %line%
(toutes ces choses, je les fais à partir de l'invite de commande), et il montre%line%
et en effetset l
montre pasline
variable. Je me demande si vous connaissez (ou, au moins, avez-vous des idées) pourquoi ça ne pouvait pas fonctionner.Oui, je sais pourquoi cela fonctionne et votre code. Je vais modifier mon post
OriginalL'auteur jeb
Bâtiment sur une autre réponse que j'ai vu ailleurs, il est possible de capturer la sortie d'une commande et de le stocker dans une variable sans intermédiaire fichier, tout simplement, tant qu'il est numérique.
Processus enfants, comme ceux à l'intérieur de la pipe ne peuvent pas partager leurs variables d'environnement, mais peut renvoyer une valeur qui est capté par %errorlevel%. %errorlevel% n'est pas une variable d'environnement si, et est calculé par la coque à chaque fois qu'il est invoqué. Il a également ne peut pas être réglé normalement, et doit être définie à l'aide d'un processus enfant. Exemple:
Retourne:
Fait intéressant, vous pouvez également le faire:
Retourne:
Je crois que c'est parce que le
echo hi
est géré par un autre processus enfant, à son tour, ce qui ne veut pas attendre le rapport de sortie avant la fin de l'impression. Cela peut être changé par une race état, mais si le texte imprimé est plus, je ne suis pas sûr si le processus de l'enfant (l'exécution de sortie) qui est le parent de l'une impression de "salut" vais attendre pour elle de l'enfant à la sortie (ou des enfants) avant de terminer la commande exit. J'ai essayé de tester avec une commande en cours d'exécution comme un Arbre, mais j'ai eu un zéro renvoyées par une requête à %errorlevel%, ce qui est probablement dû à l'Arbre d'affecter les résultats en renvoyant 0, éventuellement après laexit 56
.De toute façon, pour en revenir à ce que la plupart seront utiles:
Retourne:
Ici, la 456 imprimé par echo est capturé et renvoyées par les requêtes suivantes à l' %errorlevel%. Vous pouvez capturer n'importe quelle sortie de la commande de cette façon, même si elle est limitée à une valeur numérique. C'est toujours très utile, mais, malheureusement, ne permet pas de magasin de sortie textuelle et je ne peux pas penser à un moyen de le faire fonctionner pour le multi en ligne de sortie. (inexploré)
Je pense que, en théorie, vous pouvez enchaîner autant de commandes que vous le souhaitez, et devrait être en mesure d'utiliser
&&
d'imposer l'ordre dans lequel ils sont exécutés. Je ne sais pas comment ou si cela peut être utilisé pour la capture de plusieurs lignes d'entrée ou de permettre le retour de texte, mais devrait fournir une certaine supplémentaire de marge de manœuvre à l'intérieur du tuyau en fournissant imbriquée à l'enfant les processus de partage de leur environnement vers le bas et, éventuellement, la valeur de retour. (encore une fois pas testé, peut-être essayer plusieurs états de sortie ou quelque chose, et si j'ai appris quelque chose plus tard, je vais essayer de le poster ici)En conclusion: vous avez dit que
cmd /c exit 456
renvoie le même niveau queecho 456 | ( set /p line= & call exit %%line%% )
alors, pourquoi utiliser (ou même mention) plus compliqué méthode pour obtenir le même résultat de plus simple? C'est certainement le PAS "ce que la plupart seront utiles"...OriginalL'auteur user7722050