La console de lignes de commandes

 

 

accueil | console | VBScript | PowerShell | php | MySQL | documentation | formation  | trucs et astuces | exemples | glossaire

 

 

 

Pour tout ce qui suit, on considère que le lecteur est familier de l'utilisation de Windows et de sa console.

L'apprentissage du mode console n'est pas étudié dans ces pages.

Tous les mots soulignés renvoient principalement au glossaire, ou à une documentation Microsoft ou privée.

 

 

Généralités

La gestion d'erreurs dans l'environnement de la console

Programmation de la gestion des erreurs dans un script de la console

Error Handler en environnement de la console

Journalisation des erreurs en environnement de la console

 

 

I - GENERALITES

 

La console de lignes de commande de Windows permet deux interactions avec le système : par des commandes directement entrées au clavier (des commandes de la console ou des appels à des utilitaires) et par l'exécution de scripts. Les scripts sont des fichiers texte avec l'extension .cmd ou .bat (au choix) qui peuvent contenir des commandes de la console, des appels à des utilitaires et des instructions de programmation. Le script de commande le plus connu du temps de Windows 3.1, 95, 98 et Millenium était autoexec.bat, le script d'initialisation de Windows en mode batch.

 

Les commandes de la console sont appelées "commandes internes" et les appels aux utilitaires sont appelés "commandes externes".

 

Microsoft nomme de façon incorrecte les scripts de la console des fichiers batch, et l'exécution de scripts le mode batch. Cette appellation est erronée car le mode batch est un type de traitement qui s'oppose au mode interactif. Les scripts lancés dans un vrai mode batch sont en réalité entrés dans une file d'attente de travaux non interactifs, appelés travaux batch. Ils ont la particularité de ne pas être reliés aux périphériques d'entrée/sortie (écran, clavier, etc.) Ils ne peuvent pas recevoir d'instructions de l'opérateur (donc on n'y programme pas de questions/réponses) et ne peuvent pas envoyer de messages sur un écran. L'auteur du présent site refusant d'avaliser cette coutume erronée qui peut embrouiller les esprits, nous parlerons ici pour les scripts utilisés en interactif de scripts en mode console, et l'extension de nos scripts d'exemples interactifs sera .cmd. Avec Windows, le mode batch réel est utilisable via les tâches programmées, qui démarrent à une heure fixe et se terminent sans rien dire à personne, sauf si des informations ont été par exemple écrites volontairement dans un fichier de log. Ces scripts porteront donc tout naturellement l'extension .bat (ce qui permet de les différencier des scripts interactifs en un coup d'oeil, soit dit en passant) et seront appelés ici scripts batch, ce qui ne les empêche bien évidemment pas de pouvoir être exécutés en mode console, puisque la console ne fait pas de différence entre les extensions .cmd et .bat.

 

[Pour la petite histoire, c'est précisément parce que l'étude de la fin d'une tâche programmée - donc d'un batch - relève du parcours du combattant pour savoir pourquoi le job ne s'est pas terminé normalement que ce site Web a été créé. Quand il sera terminé et opérationnel, l'exploitant de sites Windows devrait y trouver tout ce qui sera nécessaire pour savoir (enfin) ce qui se passe pendant la nuit dans nos salles informatiques...]

 

La gestion des erreurs permet d'informer l'utilisateur d'une anomalie ou d'exécuter des instructions programmées selon la réaction de l'environnement. Par exemple, si l'on veut créer dans un script de la console un répertoire qui existe déjà et que l'on ne teste pas cette éventualité, la commande de création échouera et le script s'arrêtera avec un code retour indiquant qu'une erreur s'est produite, sans dire laquelle. De même, si un script veut créer un fichier dans un répertoire supposé existant mais qui aurait été déplacé ou effacé, la programmation d'un test d'existence préalable de ce répertoire permettra au script d'intervenir en recréant par exemple le répertoire en question ou en informant l'utilisateur de cette anomalie avant de s'arrêter avec un code retour contenant le numéro d'erreur correspondant à l'erreur rencontrée (par exemple répertoire inexistant, fichier verrouillé, ordinateur distant inaccessible, etc.)

 

 

Liste des commandes, des utilitaires et des instructions de programmation disponibles avec Windows 7

 

ASSOC Affiche ou modifie les applications associées aux extensions de fichiers.
ATTRIB Affiche ou modifie les attributs d’un fichier.
BREAK Active ou désactive le contrôle étendu de CTRL+C.
BCDEDIT Définit les propriétés dans la base de données de démarrage pour le contrôle du chargement d’amorçage.
CACLS Affiche ou modifie les listes de contrôles d’accès aux fichiers.
CALL Appelle un fichier de commandes à partir d’un autre fichier de commandes.
CD Modifie le répertoire ou affiche le répertoire actif.
CHCP Modifie ou affiche le numéro de la page de code active.
CHDIR Modifie le répertoire ou affiche le nom du répertoire actif.
CHKDSK Vérifie un disque et affiche un rapport d’état.
CHKNTFS Affiche ou modifie la vérification du disque au démarrage.
CLS Efface l’écran et son buffer
CMD Exécute une nouvelle instance de l’interpréteur de commandes de Windows.
COLOR Modifie les couleurs du premier plan et de l’arrière-plan de la console.
COMP Compare les contenus de deux fichiers ou groupes de fichiers.
COMPACT Modifie ou affiche la compression des fichiers sur une partition NTFS.
CONVERT Convertit des volumes FAT en volumes NTFS. Vous ne pouvez pas convertir le lecteur en cours d’utilisation.
COPY Copie un ou plusieurs fichiers.
DATE Affiche ou définit la date.
DEL Supprime un ou plusieurs fichiers.
DIR Affiche la liste des fichiers et des sous-répertoires d’un répertoire.
DISKCOMP Compare les contenus de deux disquettes.
DISKCOPY Copie le contenu d’une disquette sur une autre.
DISKPART Affiche ou configure les propriétés d’une partition de disque.
DOSKEY Modifie les lignes de commande, rappelle des commandes Windows, et crée des macros.
DRIVERQUERY Affiche l’état et les propriétés du pilote de périphérique en cours d’utilisation.
ECHO Affiche des messages ou active/désactive l’affichage des commandes.

EDIT Appelle l'ancien éditeur de texte du mode DOS. [pour les nostalgiques]
ENDLOCAL Stoppe la localisation des modifications d’environnement dans un fichier de commandes.
ERASE Supprime un ou plusieurs fichiers.
EXIT Quitte l’interpréteur de commandes (CMD.EXE).
FC Compare deux fichiers ou groupes de fichiers et affiche les différences.
FIND Recherche une chaîne de caractères dans un ou plusieurs fichiers.
FINDSTR Cherche des chaînes dans les fichiers.
FOR Exécute une commande sur chaque fichier d’un ensemble de fichiers.
FORMAT Formate un disque devant être utilisé avec Windows.
FSUTIL Affiche ou configure les propriétés du système de fichiers.
FTYPE Affiche ou modifie les types de fichiers utilisés dans les associations d’extensions.
GOTO Indique l’exécution d’un fichier de commandes pour une ligne identifiée par une étiquette.
GPRESULT Affiche les informations de stratégie de groupe pour un ordinateur ou un utilisateur.
GRAFTABL Permet à Windows d’afficher un jeu de caractères en mode graphique.
HELP Affiche des informations sur les commandes de Windows.
ICACLS Afficher, modifier, sauvegarder ou restaurer les listes de contrôle d’accès pour les fichiers et les répertoires.
IF Effectue un traitement conditionnel dans un fichier de commandes.
LABEL Crée, modifie ou supprime le nom de volume d’un disque.
MD Crée un répertoire.
MKDIR Crée un répertoire.
MKLINK Créer des liens symboliques et des liens réels
MODE Configure un périphérique du système.
MORE Affiche la sortie écran par écran.
MOVE Déplace un ou plusieurs fichiers d’un répertoire à un autre.
OPENFILES Affiche les fichiers partagés ouverts à distance par les utilisateurs.
PATH Affiche ou définit le chemin de recherche des fichiers exécutables.
PAUSE Interrompt l’exécution d’un fichier de commandes et affiche un message.
POPD Restaure la valeur précédente du répertoire actif enregistrée par PUSHD.
PRINT Imprime un fichier texte.
PROMPT Modifie l’invite de commande de Windows.
PUSHD Enregistre le répertoire actif puis le modifie.
RD Supprime un répertoire.
RECOVER Récupère l’information lisible d’un disque défectueux.
REM Insère un commentaire dans un fichier de commandes (ou dans CONFIG.SYS) [pour les nostalgiques].
REN Renomme un ou plusieurs fichiers.
RENAME Renomme un ou plusieurs fichiers.
REPLACE Remplace des fichiers.
RMDIR Supprime un répertoire.
ROBOCOPY Utilitaire sophistiqué pour copier les fichiers et les arborescences de répertoires
SET Affiche, définit ou supprime des variables d’environnement Windows.
SETLOCAL Commence la localisation des modifications d’environnement dans un fichier de commandes.
SC Affiche ou configure les services (processus en arrière-plan).
SCHTASKS Planifie les commandes et les programmes à exécuter sur l’ordinateur.
SHIFT Modifie la position des paramètres remplaçables dans un fichier de commandes.
SHUTDOWN Permet un arrêt local ou distant normal de l’ordinateur.
SORT Trie des entrées.
START Ouvre une fenêtre séparée pour l’exécution d’un programme ou d’une commande spécifique.
SUBST Associe un chemin d’accès à une lettre de lecteur.
SYSTEMINFO Affiche les propriétés et la configuration spécifiques de l’ordinateur.
TASKLIST Affiche toutes les tâches en cours d’exécution, y compris les services.
TASKKILL Termine ou interrompt un processus ou une application en cours d’exécution.
TIME Affiche ou définit l’heure du système.
TITLE Définit le titre de la fenêtre pour une session CMD.EXE.
TREE Affiche le graphisme de la structure de répertoire d’un lecteur ou d’un chemin d’accès.
TYPE Affiche le contenu d’un fichier texte.
VER Affiche la version de Windows.
VERIFY Demande à Windows de vérifier si vos fichiers sont correctement écrits sur le disque.
VOL Affiche le nom et le numéro de série d’un volume de disque.
XCOPY Copie les fichiers et les arborescences de répertoires.
WMIC Affiche les informations WMI dans l’interface de commande interactive.

 

Remarque : Vu que les commandes de la console et les utilitaires gèrent les erreurs de la même façon (voir plus loin), pour plus de facilité, dans tout le reste de cette page, les deux seront appelés commandes.

 

Pour en savoir plus sur chaque commande, entrer la commande suivie de " /?" sans les guillemets et avec l'espace. Ne fonctionne pas avec DISKPART, qui contient son propre interpréteur et son propre fichier d'aide, non accessible depuis la console (allez savoir pourquoi).

 

Toutes ces commandes sont susceptibles de renvoyer un code retour appelé de façon erronée Error Code.

L'auteur prévoit dans un avenir assez proche de centraliser quelque part tous les codes retour de toutes ces commandes...

 

[début]


 

II - LA GESTION D'ERREURS DANS L'ENVIRONNEMENT DE LA CONSOLE

 

L'interpréteur de la console (programme CMD.EXE) reçoit en fin d'exécution de toute commande un code retour contenant une valeur égale ou différente de zéro. Si ce code égale zéro, cela signifie que la commande s'est terminée normalement. Dans le cas contraire, il contient un numéro d'erreur.

 

Ce code retour est écrit dans la variable système errorlevel.

 

Errorlevel peut contenir les valeurs  0, 1, 2 ou -2 pour ce qui est des commandes de la console, ou toute autre valeur positionnée volontairement par un programme, un utilitaire, un script de la console, un script VBScript ou un script PowerShell.

 

Les valeurs du code retour de la console signifient :

 

 0  = pas d'erreur

 1  = erreur (inconnue) retournée par la commande qui s'est exécutée

 2  = erreur d'exécution de la commande (qui ne s'est donc pas exécutée)

-2  = erreur mathématique

 

Exemple :

 

C:\vbs>dir toto
Le volume dans le lecteur C s'appelle HP_PAVILION
Le numéro de série du volume est F4F6-1637

Répertoire de C:\vbs

Fichier introuvable

C:\vbs>echo %errorlevel%
1

 

Les caractères "%" indiquent que la variable errorlevel est remplacée par sa valeur.

 

 

Exemples de codes retour de quelques utilitaires

 

Exemple 1 : DiskComp retourne les valeurs suivantes :

 

 0  

 Disks are the same

 1

 Differences were found

 3

 Hard error occurred

 4

 Initialization error occurred  

 

 

Exemple 2 : DiskCopy  retourne les valeurs suivantes :

 

 0  

 Copy operation was successful

 1

 Nonfatal Read/Write error occurred  

 3

 Fatal hard error occurred

 4

 Initialization error occurred

 

 

Exemple 3 : Format  retourne les valeurs suivantes :

 

 0  

 The format operation was successful

 1

 Incorrect parameters were supplied

 4

 A fatal error occurred (which is any error other than 0, 1, or 5)

 5

 The user pressed N in response to the prompt "Proceed with Format (Y/N)?" to stop the process  

 

 

Remarque 1 : On voit ici que errorlevel contient bien un code retour et non un n° d'erreur puisque s'il contient zéro, c'est qu'il n'y a pas eu d'erreur.

 

Remarque 2 : Le fait que les codes retour ne soient pas uniques pour une même machine empêche la programmation d'un gestionnaire d'erreurs renvoyant un texte explicatif à partir d'un numéro unique, puisque les textes peuvent être différents pour un même numéro selon l'émetteur du code retour.

 

Remarque 3 : L'exemple de la commande FORMAT (ci-dessus) montre la pauvreté de la gestion des erreurs dans les scripts de la console. Le message d'erreur exact renvoyé par la console si l'on essaie de formater un disque inexistant (erreur 1) est : "Le lecteur spécifié n'existe pas". Or, selon la documentation Microsoft, le message d'erreur 1 est "Incorrect parameters were supplied". Si le programmeur s'était fié à ce texte dans son script, il pouvait toujours chercher longtemps la raison exacte de l'échec du formatage...

 

Exemple :

 

error_demo.cmd

 

@echo off
rem +
rem error_demo.cmd
rem
rem Cette procédure montre l'inconsistance entre le code retour d'une commande renvoyé par la Shell et
rem le code retour renvoyé par l'utilitaire ou la commande qui ont été exécutés.
rem
rem v1.0-0 8-oct-2010 Didier.Morandi at gmail.com
rem -
rem
rem on suppose ici que le fichier toto.txt n'existe pas
rem on essaie maintenant d'afficher le contenu de ce fichier et on récupère le message d'erreur

cls
echo Demonstration d'inconsistance entre le code retour d'une commande renvoye par
echo la Shell et le code retour renvoye par l'image ou la fonction qui a ete executee
echo 1. "type" d'un fichier inexistant
echo type TOTO.TXT
type toto.txt

rem
rem on mémorise le code retour au cas où il serait altéré par les commandes suivantes
rem
set error_level=%ERRORLEVEL%

rem
rem on affiche le code retour renvoyé par la Shell
rem
echo.
echo 2. affichage du code retour
echo ERRORLEVEL = %error_level%

rem
rem on affiche le message corresponsant à ce code
rem (l'utilitaire errcode est (c) Jean-Claude Bellamy http://www.bellamyjc.org/download/errcode.exe)
rem
echo.
echo 3. affichage du message d'erreur systeme correspondant a ce status
errcode %error_level%
echo.
echo Le message ne correspond pas. En effet, le message original porte le code 2.
echo Preuve.

echo Message d'erreur du code 1 :
errcode 1
echo.
echo Message d'erreur du code 2 :
errcode 2
echo.
echo Fin de démonstration.
echo.

:EOF

 

Résultat :

 

Demonstration d'inconsistance entre le code retour d'une commande renvoye par
la Shell et le code retour renvoye par l'image ou la fonction qui a ete executee

1. "type" d'un fichier inexistant
type TOTO.TXT
Le fichier spécifié est introuvable.

2. affichage du code retour
ERRORLEVEL = 1

3. affichage du message d'erreur systeme correspondant a ce status
Fonction incorrecte.

Le message ne correspond pas. En effet, le message original porte le code 2.
Preuve.
Message d'erreur du code 1 :
Fonction incorrecte.

Message d'erreur du code 2 :
Le fichier spécifié est introuvable.

Fin de démonstration.

c:\vbs\cmd>

 

[début]


 

III - PROGRAMMATION DE LA GESTION DES ERREURS DANS UN SCRIPT DE LA CONSOLE

 

Remarque préalable

 

Les fichiers de scripts exécutés depuis la console peuvent porter indifféremment l'extension .cmd ou .bat. Selon qu'ils ont pour vocation d'être exécutés en mode interactif (appelé ici mode console) ou en mode batch, le programmeur choisira judicieusement l'extension la plus appropriée.

 

[Lire la remarquable documentation (clic droit / enregistrer la cible du lien sous) de Victor Laurie (en anglais, Pdf, 702 Ko) sur "La ligne de commande Windows et les fichiers batch", ou celle de Microsoft ici et ]

 

 

Dans un script de la console il n'y a pas de possibilité de gestion des erreurs a priori grâce à ce que l'on appelle un Error Handler dont la première ligne de code est souvent semblable à On Error then... Chaque commande écrite dans un script et susceptible de renvoyer un code retour (les instructions de programmation ne le font pas) doit donc être suivie d'un test de ce code retour, écrit  dans la variable système errorlevel. Ce test s'effectue selon la syntaxe suivante :

 

if [not] ERRORLEVEL <Number> <Command> [else <Expression>]
 

Ce qui, en pseudocode, se lit :

 

"Si le code retour égale [ou est différent de] <Number> alors effectuer les commandes <Command> sinon effectuer les commandes <Expression>"

 

La valeur 0 pour la variable système errorlevel signifie qu'il n'y a pas eu d'erreur, sinon errorlevel prend une valeur égale au numéro du message d'erreur rencontrée.

 

Exemple :

 

error_level.cmd

 

@echo off
format a:
if not errorlevel 1 goto END
echo Une erreur %errorlevel% a été renvoyée par la commande FORMAT.
:END
echo Fin du job.

 

if not errorlevel 1 signifie "s'il n'y a pas eu une erreur de numéro égal ou supérieur à 1"

 

Résultat :

 

c:\vbs>error_level
Le lecteur spécifié n'existe pas.
Une erreur 1 a été renvoyée par la commande FORMAT.
Fin du job.

 

C:\vbs>echo %errorlevel%
1

 

Rappel : L'instruction Format appelle un utilitaire de la console qui peut renvoyer quatre valeurs 0, 1, 4 ou 5 (voir § II ci-dessus).

 

Remarque : La rédaction des scripts de la console ne doit pas obligatoirement suivre la coutume de la notation hongroise, qui consiste à écrire toutes les commandes avec une majuscule au début, ou les commandes composées de plusieurs mots avec une majuscule au début de chaque mot, contrairement à VBScript et PowerShell. De plus, pour ces deux derniers moteurs de scripts, la coutume veut que seules les constantes soient écrites intégralement en majuscules. C'est pourquoi dans ce site, les exemples de scripts de la console ne suivent pas la notation hongroise, et la variable système errorlevel n'est pas écrite en majuscules, comme c'est le cas dans la documentation de Microsoft, publiée alors que VBScript et PowerShell n'existaient pas encore. 

 

[début]


 

IV - ERROR HANDLER EN ENVIRONNEMENT DE LA CONSOLE

 

On l'a vu, un tel Error Handler n'est pas programmable dans l'environnement de la console si l'on n'utilise pas VBScript ou PowerShell. Il est donc nécessaire de faire suivre toute commande de scripts de la console par le test décrit au § III ci-dessus.

 

[début]


 

V - JOURNALISATION DES ERREURS EN ENVIRONNEMENT DE LA CONSOLE

 

Pouvoir être informé en temps réel d'une erreur, c'est bien, mais pouvoir consulter un journal d'exploitation le matin en arrivant, c'est encore mieux. Voici donc un petit script tout simple pour journaliser les évènements de la nuit passée.

 

log_demo.cmd

 

@echo off
rem +
rem log_demo.cmd
rem script de démonstration de la gestion d'un fichier de log
rem v1.0-0 29-oct-2010 Didier.Morandi at gmail.com
rem -

if "%1" == "" (echo Syntax: log_demo file) & goto :EOF

set file="%1"
echo * Typing file %file%
type %file%
if not errorlevel 1 goto :EOF else goto :ERR

:ERR
set errnr=%errorlevel%
set timestamp=%date% %time%
set thisproc=%0
echo *** An error %errnr% has occurred
echo Opening error logfile errlog.txt
if not exist errlog.txt echo Logfile created on %timestamp% > errlog.txt
echo Updating error logfile
echo %timestamp%-%thisproc%-Error %errnr% trying to type file %file% >> errlog.txt
echo %timestamp%-%thisproc%-File not found >> errlog.txt
echo %timestamp%-%thisproc%-Procedure aborted >> errlog.txt
echo closing error logfile

:EOF

 

Rappels :

 

%0 est une variable système qui contient le nom de la procédure exécutée

 

%1 est le premier paramètre passé à la procédure au moment de son exécution à partir de la ligne de commande

 

goto :EOF est une instruction qui permet de quitter un script, même si l'étiquette :EOF n'existe pas. C'est pour cela qu'il n'y a pas de code après notre étiquette :EOF

 

%date% et %time% sont des variables système

 

if not exist <filename> est la programmation standard pour tester l'existence d'un fichier

 

> est une redirection simple vers un fichier inexistant qui est créé automatiquement ; s'il existe il est effacé et remplacé par une nouvelle version

 

>> est une redirection avec la fonction ajout en fin de fichier ; s'il n'existe pas, il est créé ; s'il existe, le texte est ajouté à la suite du contenu précédent

 

Attention à ne pas mettre d'espace avant le signe "=" dans les commandes SET, sinon l'espace devient partie du nom de la variable. [oui, c'est nul]

 

Résultat :

 

c:\vbs\cmd>log_demo.cmd toto.txt
* Typing file "toto.txt"
Le fichier spécifié est introuvable.
*** An error 1 has occurred
Opening error logfile errlog.txt
Updating error logfile
closing error logfile


c:\vbs\cmd>log_demo.cmd titi.pdf
* Typing file "titi.pdf"
Le fichier spécifié est introuvable.
*** An error 1 has occurred
Opening error logfile errlog.txt
Updating error logfile
closing error logfile


c:\vbs\cmd>type errlog.txt
Logfile created on 29/10/2010 18:17:38,00
29/10/2010 18:17:38,00-log_demo.cmd-Error 1 trying to type file "toto.txt"
29/10/2010 18:17:38,00-log_demo.cmd-File not found
29/10/2010 18:17:38,00-log_demo.cmd-Procedure aborted
29/10/2010 18:18:00,49-log_demo.cmd-Error 1 trying to type file "titi.pdf"
29/10/2010 18:18:00,49-log_demo.cmd-File not found
29/10/2010 18:18:00,49-log_demo.cmd-Procedure aborted

c:\vbs\cmd>

 

L'auteur n'a pas passé la nuit à concevoir un script un peu plus élaboré vu que cela fait plus de dix ans que l'on utilise VBScript à la place des bons vieux scripts de la console de lignes de commande...

 

[début]


 

accueil | console | VBScript | PowerShell | documentation | formation  | trucs et astuces | exemples | glossaire