Problème avec la sortie de cette commande FOR

0

Je viens de me rendre compte que je suis en train d'exécuter un fichier chauve-souris au début de cette clé de registre qui contenait, entre echo running abcautres choses

HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\AutoRun

Donc, ici, j'ai modifié ce fichier chauve-souris. Il ne s'agit que d'une ligne, rien de pertinent.

vous voyez le contenu du fichier bat.

Voici quelques résultats de l’invite cmd montrant la situation actuelle. C’est le même problème fondamental, mais vous devriez pouvoir le reproduire.

La question est maintenant,

  • Pourquoi dit-on echo sss et non echo sss ttt?
  • Comment puis-je supprimer l'exécution de cmd ou ce fichier de batte d'initialisation avec le FOR? La déclaration FOR doit simplement afficher "echo g", et non "echo sss" ou "echo sss ttt".

Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.
sss ttt
C:\Documents and Settings\Administrator>cd\

C:\>type \blah\startfile.bat <ENTER>
@echo sss ttt   

C:\>  

C:\>for /f %f in ('echo g ^| findstr "g"') do echo %f <ENTER>

C:\>echo sss
sss

C:\>echo g
g

C:\>
barlop
la source
2
Impossible de reproduire. Quelle version de Windows est-ce?
Mat le
J'ai "La syntaxe de la commande est incorrecte."
Simon Sheehan le
1
Cela fonctionne comme prévu pour moi (Win 7) - pas de commande "echo running" mystère.
cʜιᴇ007
@ techie007 xp mais juste essayé sur une autre machine et ce n'est que sur un ordinateur
barlop
@jaquer ^ est le caractère d'échappement essayez-le sans et vous voyez qu'il en a besoin. sinon il pourrait essayer de faire le | au début du traitement et donne une erreur lorsque vous voyez si vous n'utilisez pas ^.
Barlop

Réponses:

1

Pourquoi dit-on echo sss et non echo sss ttt?

Parce que la ligne sss tttcontient un caractère d'espacement. La forcommande tokenize et magasins du premier semestre sssdans %fet la seconde moitié tttde %gvariable.

Comment puis-je supprimer l'exécution de cmd ou ce fichier de batte d'initialisation avec le FOR? La déclaration FOR doit simplement afficher "echo g", et non "echo sss" ou "echo sss ttt".

On dirait que pour évaluer echo g ^| findstr "g"un nouvel interpréteur de commandes est initialisé et que votre \blah\startfile.batest exécuté automatiquement. Faites votre lot pour ne rien produire.

Vlastimil Ovčáčík
la source
0

Si vous utilisez %fun fichier de commandes, vous devez l’échapper avec un autre %:

for /f %%f in ('echo g ^| findstr "g"') do echo %%f

Mettez cela dans votre fichier de commandes et vous devriez obtenir les résultats que vous recherchez.

tête d'arbre
la source
Le FOR n'était pas dans un fichier de commandes. Essayez de lire la question plus attentivement. Regardez le dump à partir de l'invite de commande.
Barlop
Oups. Oui, je le vois maintenant. Je mettrai à jour ma réponse ...
treehead
0

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:\>
Kevin Fegan
la source