2017-02-02 3 views
0

Ligne de commande CMD: Une commande CMD, une ligne de commande, pas de fichier BAT.CMD Command Line: Une commande plus la sortie directe de l'ERRORLEVEL dans un TXT?

Y at-il une chance d'obtenir l'ERRORLEVEL directement écrit dans un fichier TXT?

J'ai essayé mais j'ai échoué.

Je ne veux pas créer et enregistrer un fichier BAT à chaque fois.

Je préférerais la manière la plus simple: CMD simple commande plus l'exportation de l'ERRORLEVEL dans un fichier TXT, le tout dans une ligne de commande.

Tommy

+2

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

+0

"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

+0

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

Répondre

4

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> 
+0

Impressionnant. Je n'ai pas eu ce que l'OP voulait ... Bonne explication! – geisterfurz007

+0

Salut, j'ai besoin exactement de ceci: (commandToExecute) & echo% errorlevel%> "file.txt" Mais cela ne fonctionne pas. – Donny73Ger

+0

@ Donny73Ger, Non, vous n'en avez pas besoin, comme vous le signalez, cela ne fonctionne pas. Vous avez besoin de '(commandToExecute) &>" file.txt "appel echo%^errorlevel%' –

0

Une autre approche à l'aide enabled Delayed Expansion (voir /V:ON switch), juste pour être complet:

cmd /D /V:ON /C "command to execute&>>currError.txt echo !errorlevel!" 

Les exemples (sortie currError.txt est étendu pour contenir l'horodatage en plus de errorlevel):

==> type currError.txt 
The system cannot find the file specified. 

==> cmd /D /V:ON /C "echox "x"&>>currError.txt echo %date% %time% errorlevel !errorlevel!" 
'echox' is not recognized as an internal or external command, operable program or batch file. 

==> type currError.txt 
02.02.2017 9:12:28,34 errorlevel 9009 

==> cmd /D /V:ON /C "echo "x"&>>currError.txt echo %date% %time% errorlevel !errorlevel!" 
"x" 

==> type currError.txt 
02.02.2017 9:12:28,34 errorlevel 9009 
02.02.2017 9:12:43,32 errorlevel 0 

==> rem output fails if "command to execute" is syntactically wrong 

==> cmd /D /V:ON /C "if "x"&>currError.txt echo %date% %time% errorlevel !errorlevel!" 
& was unexpected at this time. 

==> type currError.txt 
02.02.2017 9:12:28,34 errorlevel 9009 
02.02.2017 9:12:43,32 errorlevel 0 

==> rem "call" approach for the sake of completeness: 

==> echox "x"&>>currError.txt call echo %date% %time% errorlevel %errorlevel^% 
'echox' is not recognized as an internal or external command, operable program or batch file. 

==> type currError.txt 
02.02.2017 9:12:28,34 errorlevel 9009 
02.02.2017 9:12:43,32 errorlevel 0 
02.02.2017 14:42:28,06 errorlevel 9009 

==> rem fails as well if "command to execute" is syntactically wrong 

==> if "x"&>>currError.txt call echo %date% %time% errorlevel %errorlevel^% 
& was unexpected at this time. 

==> type currError.txt 
02.02.2017 9:12:28,34 errorlevel 9009 
02.02.2017 9:12:43,32 errorlevel 0 
02.02.2017 14:42:28,06 errorlevel 9009 

==> 
+0

Cela fonctionne: cmd/von/c "appel (commandToExecute) &>" fichier.txt "echo! Errorlevel! – Donny73Ger

0

Première variable, définir un "p" avec un pour cent signe:

set "p=%" 

Ensuite, utilisez cette ligne:

(commandToExecute) & >"file.txt" call echo %p%errorlevel%p% 

Testé sur Windows 8.1