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
là]
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
|