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 abc
autres 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:\>
windows
command-line
barlop
la source
la source
Réponses:
Parce que la ligne
sss ttt
contient un caractère d'espacement. Lafor
commande tokenize et magasins du premier semestresss
dans%f
et la seconde moitiéttt
de%g
variable.On dirait que pour évaluer
echo g ^| findstr "g"
un nouvel interpréteur de commandes est initialisé et que votre\blah\startfile.bat
est exécuté automatiquement. Faites votre lot pour ne rien produire.la source
Si vous utilisez
%f
un fichier de commandes, vous devez l’échapper avec un autre%
:Mettez cela dans votre fichier de commandes et vous devriez obtenir les résultats que vous recherchez.
la source
Juste pour développer un peu la réponse de Vlastimil ...
Lorsque la
FOR
commande exécute le"echo g"
et achemine la sortie versfindstr
, FOR commence par démarrer un nouveau processeur de commandes qui entraîne\blah\startfile.bat
son 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 :
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"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.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" ).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" :
Donc, dans votre exemple, si vous aviez ajouté l'
"delims="
option, vous verriez ceci:la source