Ce, la première idée habituelle, échouera
(commandToExecute) & >"file.txt" echo %errorlevel%
Le problème est que la ligne de commande complète est analysée puis exécuté. Pendant la phase d'analyse, toutes les opérations de lecture de variables sont supprimées de la commande en cours de remplacement par la valeur stockée dans les variables avant de commencer à exécuter la commande.
Cela signifie qu'une seule ligne ne peut pas modifier une variable et récupérer la valeur modifiée car il n'y a aucune opération de lecture dans la commande exécutée.
Note: sans ce cas, cette analyse syntaxique/remplacer le comportement affecte une ligne complète à la lecture, mais aussi à toutes les lignes à l'intérieur d'un bloc, qui est, toutes les lignes ci-joint entre parenthèses. Lorsque l'exécution atteint un bloc de code, toutes les lignes du bloc sont lues, toutes les opérations de lecture de variables à l'intérieur du bloc sont remplacées et l'exécution des commandes résultantes commence.
La vraie commande exécutée est (supossing errorlevel est 0 avant l'exécution)
(commandToExecute) & >"file.txt" echo 0
La manière habituelle de traiter avec elle est de permettre l'expansion retardée. Cela vous permet de changer où besoin la syntaxe utilisée pour accéder à une variable de %var%
en !var!
. Cela indique à l'analyseur que la substitution variable/valeur doit être retardée jusqu'à ce que la commande soit exécutée, et non lorsque la ligne est analysée. Ceci est fait avec la commande setlocal enabledelayedexpansion
. Mais, cette commande n'a aucun effet en ligne de commande, uniquement sur les fichiers de traitement par lots. En ligne de commande, il est nécessaire de démarrer l'instance cmd
avec le commutateur /v
pour activer l'extension différée. Si vous commencez votre cmd
par exemple avec l'expansion retardée vous pouvez utiliser
(commandToExecute) & >"file.txt" echo !errorlevel!
Mais avec l'expansion retardée activée, !
dans les commandes becames un problème que l'analyseur verra dans le cadre d'une requête de lecture variable.
Vous avez une autre alternative.Vous pouvez écrire la commande d'une manière que la variable se n'remplacé au moment de l'analyse, puis, à exécuter la force de temps une nouvelle analyse syntaxique de la commande
Avec la
^
la variable
(commandToExecute) & >"file.txt" call echo %^errorlevel%
n'est pas reconnu, et la commande est analysable et exécuté comme
(commandToExecute) & >"file.txt" call echo %errorlevel%
ensuite, lorsque la commande call
est exécutée une nouvelle phase d'analyse syntaxique est invoquée puis, après la première commande a été exécutée et le errorlevel
a changé, la variable est remplacée dans la ligne et la La valeur correcte est envoyée au fichier.
modifié adapter aux commentaires - Juste une séance de test (désolé, locale espagnol)
W:\41996740>dir /b
W:\41996740>(commandToExecute) & >"file.txt" call echo %^errorlevel%
"commandToExecute" no se reconoce como un comando interno o externo,
programa o archivo por lotes ejecutable.
W:\41996740>dir /b
file.txt
W:\41996740>type file.txt
9009
W:\41996740>(dir /b file.txt) & >"file.txt" call echo %^errorlevel%
file.txt
W:\41996740>type file.txt
0
W:\41996740>(dir /b file.exe) & >"file.txt" call echo %^errorlevel%
No se encuentra el archivo
W:\41996740>type file.txt
1
W:\41996740>
Veuillez réécrire votre question dans un état compréhensible. J'ai à peine ce que vous voulez, sauf pour écrire le 'errorlevel' dans un fichier et que vous échouez avec les fichiers batch. Dans ce cas, je suggère de montrer le ou les fichiers batch ou ce que vous rencontrez des problèmes et de vous en soucier un peu :) – geisterfurz007
"Je ne veux pas créer et enregistrer un fichier BAT." Est-ce difficile à comprendre? :-) Je veux exécuter plusieurs commandes CMD "à la volée". Donc, la création de nombreux fichiers BAT n'est pas le meilleur moyen ... Je le pense. Dans chaque cas, il s'agit d'une seule commande. Et j'ai besoin du errorlevel (il y a 5 ou 6 valeurs entières que je pourrais obtenir comme résultat). – Donny73Ger
Alors ** ne ** créez pas et ** ** n'enregistrez pas ** un fichier batch! Boom si facile! Mais je suppose que cela n'a pas été votre question ... Vous avez quelques façons d'y aller: Tapez des choses chaque fois que vous en avez besoin dans l'invite de commande, créez un fichier batch pour l'utilisation de double-clic ou stockez des commandes en ligne une variable d'environnement pour une utilisation plus rapide. – geisterfurz007