Juste pour développer un peu la réponse de Vlastimil ...
Lorsque la FORcommande exécute le "echo g"et achemine la sortie vers findstr, FOR commence par démarrer un nouveau processeur de commandes qui entraîne \blah\startfile.batson exécution.
\ blah \ startfile.bat affiche une ligne contenant sss ttt. Cette ligne est traitée par FOR et n'est PAS transmise à findstr .
Selon l'aide pour POUR :
Le traitement consiste à ..., en le découpant en lignes de texte individuelles, puis en analysant chaque ligne en zéro ou plusieurs jetons. Le corps de la boucle for est ensuite appelé avec la ou les valeurs de variable définies sur la ou les chaînes de jeton trouvées. Par défaut, / F transmet le premier jeton séparé en blanc de chaque ligne ...
Les délimiteurs par défaut pour FOR sont: ",;" (virgule et point-virgule).
La première ligne que FOR traite contient la chaîne: sss ttt . Cette chaîne contient un " "(espace), qui est un délimiteur par défaut pour FOR , qui analyse la ligne et affecte la première chaîne de jeton: "sss" à "% f" . Donc "echo% f" génère une ligne avec seulement: "sss" . C'est la première ligne que vous voyez imprimée. Le "ttt" est simplement supprimé car la commande "FOR ... echo% f" n'a pas spécifié d'inclure autre chose que le premier jeton.
Si la commande FOR était écrite différemment, vous auriez vu la ligne complète "sss ttt" en écho.
Voici 3 manières dont la commande FOR aurait pu être écrite pour le faire.
La première façon, en utilisant l' "delims="option, définit le délimiteur pour FOR sur "vide", donc FOR renvoie la ligne entière sous la forme d'un jeton. Les jetons sont toujours analysés et tous les délimiteurs ( ",;" ) sont supprimés, puis tous les jetons sont à nouveau combinés avec un espace entre chaque jeton. Cette valeur combinée est renvoyée dans la variable "% f"
C:\>for /f "delims=" %f in ('echo sss ttt') do echo %f
C:\>echo sss ttt
sss ttt
C:\>for /f "delims=" %f in ('echo mm;nn,oo, ;ss ,, tt') do echo %f
C:\>echo mm nn oo ss tt
mm nn oo ss tt
Cette manière suivante, à l'aide de l' "tokens=*"option, indique à FOR de placer tous les jetons trouvés dans la valeur de la variable spécifiée ( "% f" ). Les jetons sont toujours analysés et tous les délimiteurs sont supprimés, puis tous les jetons sont de nouveau combinés avec un espace entre chaque jeton.
C:\>for /f "tokens=*" %f in ('echo sss ttt') do echo %f
C:\>echo sss ttt
sss ttt
C:\>for /f "tokens=*" %f in ('echo mm;nn,oo, ;ss ,, tt') do echo %f
C:\Users\1-kevin>echo mm nn oo ss tt
mm nn oo ss tt
Cette troisième façon, à l'aide de l' "tokens=1,*"option, indique à FOR de placer le premier (1) jeton trouvé dans la valeur de la variable spécifiée ( "% f" ). Et, les jetons restants sont analysés et tous les délimiteurs sont supprimés, puis tous ces jetons restants sont combinés à nouveau avec un espace entre chaque jeton, et cette valeur combinée est renvoyée dans la variable nommée avec la lettre qui suit le nom de variable spécifié (donc dans ce cas, variable "% g" ).
C:\>for /f "tokens=1,*" %f in ('echo sss ttt') do echo %f %g
C:\>echo sss ttt
sss ttt
C:\>for /f "tokens=1,*" %f in ('echo mm;nn,oo, ;ss ,, tt') do echo "%f" "%g"
C:\>echo "mm" "nn oo ss tt"
"mm" "nn oo ss tt"
Notez que ce qui suit ne fonctionnera pas car il n'y a pas de "tokens =" défini pour les variables au-delà de la variable spécifiée de "% f" :
C:\>for /f %f in ('echo sss ttt') do echo %f %g
C:\>echo sss %g
sss %g
Donc, dans votre exemple, si vous aviez ajouté l' "delims="option, vous verriez ceci:
C:\>for /f "delims=" %f in ('echo g ^| findstr "g"') do echo %f
C:\>echo sss ttt
sss ttt
C:\>echo g
g
C:\>