Fichiers Batch
Une compétence complète pour créer, éditer, déboguer et maintenir des fichiers batch Windows (.bat/.cmd) en utilisant cmd.exe. S'applique au développement d'outils CLI, à l'automatisation de l'administration système, aux tâches planifiées, aux scripts d'opérations fichiers et aux scripts exécutables basés sur PATH.
Quand utiliser cette compétence
- Créer ou éditer des fichiers
.batou.cmd - Automatiser des tâches Windows (opérations fichiers, déploiements, sauvegardes)
- Construire des outils CLI destinés à un dossier
bin/sur PATH - Écrire des scripts de tâches planifiées (SCHTASKS, Task Scheduler)
- Déboguer les problèmes de scripts batch (expansion de variables, niveaux d'erreur, guillemets)
- Intégrer des scripts batch avec des outils externes (curl, git, Node.js, Python)
- Créer des projets batch avec des modèles structurés
Prérequis
- Système d'exploitation basé sur Windows NT (Windows 7 ou ultérieur)
- cmd.exe (intégré)
- Optionnel : un répertoire
bin/sur PATH pour distribuer les scripts comme des commandes - Optionnel : PATHEXT configuré pour inclure
.BAT;.CMD(par défaut sur Windows)
Interprétation des commandes
cmd.exe traite chaque ligne selon quatre étapes dans l'ordre :
- Substitution de variables — Les jetons
%VAR%sont remplacés par les valeurs des variables d'environnement.%0–%9font référence aux arguments du batch.%*se développe en tous les arguments. - Guillemets et échappement — Le caret
^échappe les caractères spéciaux (& | < > ^). Les guillemets empêchent l'interprétation des caractères spéciaux qu'ils contiennent. Dans les fichiers batch,%%produit un%littéral. - Analyse syntaxique — Les lignes sont scindées en pipelines (
|), commandes composées (&,&&,||) et groupes entre parenthèses( ). - Redirection —
>écrase,>>ajoute,<lit l'entrée,2>redirige stderr,2>&1fusionne stderr dans stdout,>NULignore la sortie.
Variables
Variables d'environnement
set _MY_VAR=Hello World
echo %_MY_VAR%
set _MY_VAR=
setsans arguments affiche toutes les variablesset _PREFIXaffiche les variables commençant par_PREFIX- Pas d'espaces autour de
=—set name = valdéfinit la variable"name "à" val"
Variables spéciales
| Variable | Valeur |
|---|---|
%CD% |
Répertoire courant |
%DATE% |
Date système (dépend de la locale) |
%TIME% |
Heure système HH:MM:SS.mm |
%RANDOM% |
Nombre pseudo-aléatoire 0–32767 |
%ERRORLEVEL% |
Code de sortie de la dernière commande |
%USERNAME% |
Nom d'utilisateur courant |
%USERPROFILE% |
Chemin du profil utilisateur courant |
%TEMP% / %TMP% |
Répertoire de fichiers temporaires |
%PATHEXT% |
Liste des extensions exécutables |
%COMSPEC% |
Chemin vers cmd.exe |
Portée avec SETLOCAL / ENDLOCAL
setlocal
set _LOCAL_VAR=scoped value
endlocal
REM _LOCAL_VAR n'est plus défini ici
Pour retourner une valeur d'un bloc avec portée :
endlocal & set _RESULT=%_LOCAL_VAR%
Expansion différée
Les variables à l'intérieur de blocs entre parenthèses sont développées au moment de l'analyse. Utilisez l'expansion différée pour l'évaluation à l'exécution :
setlocal EnableDelayedExpansion
set _COUNT=0
for /l %%i in (1,1,5) do (
set /a _COUNT+=1
echo !_COUNT!
)
endlocal
!VAR!se développe à l'exécution (différé)%VAR%se développe à l'analyse (immédiat)
Flux de contrôle
Exécution conditionnelle
if exist "output.txt" echo File found
if not defined _MY_VAR echo Variable not set
if "%_STATUS%"=="ready" (echo Go) else (echo Wait)
if %ERRORLEVEL% neq 0 echo Command failed
Opérateurs de comparaison : equ, neq, lss, leq, gtr, geq. Utilisez /i pour les comparaisons de chaînes insensibles à la casse.
Commandes composées
command1 & command2 & REM Toujours exécuter les deux
command1 && command2 & REM Exécuter command2 seulement si command1 réussit
command1 || command2 & REM Exécuter command2 seulement si command1 échoue
Boucles FOR
REM Itérer sur un ensemble de valeurs
for %%i in (alpha beta gamma) do echo %%i
REM Plage numérique : début, pas, fin
for /l %%i in (1,1,10) do echo %%i
REM Fichiers dans un répertoire
for %%f in (*.txt) do echo %%f
REM Recherche de fichiers récursive
for /r %%f in (*.log) do echo %%f
REM Répertoires seulement
for /d %%d in (*) do echo %%d
REM Analyser la sortie de commande
for /f "tokens=1,2 delims=:" %%a in ('ipconfig ^| findstr "IPv4"') do echo %%b
REM Analyser les lignes du fichier
for /f "usebackq tokens=*" %%a in ("data.txt") do echo %%a
GOTO et labels
goto :main_logic
:usage
echo Usage: %~nx0 [options]
exit /b 1
:main_logic
echo Running main logic...
goto :eof
goto :eof quitte le batch courant ou la subroutine. Les labels commencent par :.
Arguments de ligne de commande
| Syntaxe | Valeur |
|---|---|
%0 |
Nom du script tel qu'invoqué |
%1–%9 |
Arguments positionnels |
%* |
Tous les arguments (non affectés par SHIFT) |
%~1 |
Argument 1 avec guillemets encadrants supprimés |
%~f1 |
Chemin complet de l'argument 1 |
%~d1 |
Lettre du lecteur de l'argument 1 |
%~p1 |
Chemin (sans lecteur) de l'argument 1 |
%~n1 |
Nom du fichier (sans extension) de l'argument 1 |
%~x1 |
Extension de l'argument 1 |
%~dp0 |
Lecteur et chemin du fichier batch lui-même |
%~nx0 |
Nom du fichier avec extension du batch |
%~z1 |
Taille du fichier de l'argument 1 |
%~$PATH:1 |
Chercher l'argument 1 dans PATH |
Modèle d'analyse des arguments
:parse_args
if "%~1"=="" goto :args_done
if /i "%~1"=="--help" goto :usage
if /i "%~1"=="--output" (
set "_OUTPUT_DIR=%~2"
shift
)
shift
goto :parse_args
:args_done
Traitement de chaînes
Sous-chaînes
set _STR=Hello World
echo %_STR:~0,5% & REM "Hello"
echo %_STR:~6% & REM "World"
echo %_STR:~-5% & REM "World"
echo %_STR:~0,-6% & REM "Hello"
Recherche et remplacement
set _STR=Hello World
echo %_STR:World=Earth% & REM "Hello Earth"
echo %_STR:Hello=% & REM " World" (supprimer "Hello")
Test de contenance de sous-chaîne
if not "%_STR:World=%"=="%_STR%" echo Contains "World"
Fonctions
Les fonctions utilisent des labels, CALL et SETLOCAL/ENDLOCAL :
@echo off
call :greet "Jane Doe"
echo Result: %_GREETING%
exit /b 0
:greet
setlocal
set "_MSG=Hello, %~1"
endlocal & set "_GREETING=%_MSG%"
exit /b 0
call :label argsinvoque une fonctionexit /brevient de la fonction (pas du script)- Utilisez l'astuce
endlocal & setpour passer les valeurs hors d'un bloc avec portée
Arithmétique
set /a effectue une arithmétique entière signée sur 32 bits :
set /a _RESULT=10 * 5 + 3
set /a _COUNTER+=1
set /a _REMAINDER=14 %% 3 & REM Utiliser %% pour le modulo dans les fichiers batch
set /a _BITS="255 & 0x0F" & REM ET au niveau du bit
Opérateurs supportés : + - * / %% ( ) et au niveau du bit & | ^ ~ << >>.
Les littéraux hexadécimaux (0xFF) et octaux (077) sont supportés.
Gestion des erreurs
Conventions de niveau d'erreur
0= succès- Non-zéro = échec (généralement
1)
mycommand.exe
if %ERRORLEVEL% neq 0 (
echo ERROR: mycommand failed with code %ERRORLEVEL%
exit /b %ERRORLEVEL%
)
Modèle fail-fast
command1 || (echo command1 failed & exit /b 1)
command2 || (echo command2 failed & exit /b 1)
Définition des codes de sortie
exit /b 0 & REM Retourner un succès d'un batch/fonction
exit /b 1 & REM Retourner un échec
cmd /c "exit /b 42" & REM Définir ERRORLEVEL à 42 en ligne
Référence des commandes essentielles
Opérations fichiers
| Commande | Objectif |
|---|---|
DIR |
Afficher le contenu du répertoire |
COPY |
Copier les fichiers |
XCOPY |
Copie étendue avec sous-répertoires (hérité) |
ROBOCOPY |
Copie robuste avec retry, mirroring, logging |
MOVE |
Déplacer ou renommer des fichiers |
DEL |
Supprimer les fichiers |
REN |
Renommer les fichiers |
MD / MKDIR |
Créer des répertoires |
RD / RMDIR |
Supprimer les répertoires |
MKLINK |
Créer des liens symboliques ou physiques |
ATTRIB |
Afficher ou définir les attributs de fichier |
TYPE |
Afficher le contenu du fichier |
MORE |
Affichage paginé de fichier |
TREE |
Afficher la structure du répertoire |
REPLACE |
Remplacer les fichiers de destination par la source |
COMPACT |
Afficher ou définir la compression NTFS |
EXPAND |
Extraire les fichiers .cab |
MAKECAB |
Créer les archives .cab |
TAR |
Créer ou extraire les archives tar |
Recherche et traitement de texte
| Commande | Objectif |
|---|---|
FIND |
Rechercher les chaînes littérales |
FINDSTR |
Rechercher avec expressions régulières limitées |
SORT |
Trier les lignes par ordre alphabétique |
CLIP |
Copier l'entrée piped dans le presse-papiers |
FC |
Comparer deux fichiers |
COMP |
Comparaison binaire de fichiers |
CERTUTIL |
Encoder/décoder Base64, calculer les hachages |
Informations système
| Commande | Objectif |
|---|---|
SYSTEMINFO |
Configuration système complète |
HOSTNAME |
Afficher le nom de l'ordinateur |
VER |
Version de Windows |
WHOAMI |
Informations sur l'utilisateur et le groupe actuels |
TASKLIST |
Afficher la liste des processus en cours |
TASKKILL |
Terminer les processus |
WMIC |
Requêtes WMI (lecteurs, système d'exploitation, mémoire) |
SC |
Contrôle de service (query, start, stop) |
DRIVERQUERY |
Afficher la liste des pilotes installés |
REG |
Opérations de registre (query, add, delete) |
SETX |
Définir les variables d'environnement persistantes |
Réseau
| Commande | Objectif |
|---|---|
PING |
Tester la connectivité réseau |
IPCONFIG |
Configuration IP |
NSLOOKUP |
Recherche DNS |
NETSTAT |
Connexions réseau et ports |
TRACERT |
Trace la route vers l'hôte |
NET USE |
Mapper/déconnecter les lecteurs réseau |
NET USER |
Gérer les comptes utilisateurs |
NETSH |
Utilitaire de configuration réseau |
ARP |
Gestion du cache ARP |
ROUTE |
Gestion de la table de routage |
CURL |
Requêtes HTTP (Windows 10+) |
SSH |
Shell sécurisé (Windows 10+) |
Planification et automatisation
| Commande | Objectif |
|---|---|
SCHTASKS |
Créer et gérer les tâches planifiées |
TIMEOUT |
Attendre N secondes (Vista+) |
START |
Lancer les programmes de manière asynchrone |
RUNAS |
Exécuter en tant qu'utilisateur différent |
SHUTDOWN |
Arrêt ou redémarrage |
FORFILES |
Trouver les fichiers par date et exécuter les commandes |
Utilitaires Shell
| Commande | Objectif |
|---|---|
WHERE |
Localiser les exécutables dans PATH |
DOSKEY |
Créer les macros de commande |
CHOICE |
Demander une entrée à touche unique |
MODE |
Configurer la taille de la console et les ports |
SUBST |
Mapper le dossier à la lettre du lecteur |
CHCP |
Obtenir ou définir la page de codes console |
COLOR |
Définir les couleurs de la console |
TITLE |
Définir le titre de la fenêtre console |
ASSOC / FTYPE |
Associations de types de fichiers |
Syntaxe Shell et expressions
Parenthèses pour le regroupement
Les parenthèses transforment les commandes composées en une seule unité pour la redirection ou l'exécution conditionnelle :
(echo Line 1 & echo Line 2) > output.txt
if exist "data.csv" (
echo Processing...
call :process "data.csv"
) else (
echo No data found.
)
Caractères d'échappement
Le caret ^ échappe le caractère suivant :
echo Total ^& Summary & REM Affiche : Total & Summary
echo 100%% complete & REM Affiche : 100% complete (dans batch)
echo Line one^
Line two & REM Le caret échappe la nouvelle ligne
Après un pipe, le triple caret est nécessaire : echo x ^^^& y | findstr x
Caractères génériques
*correspond à n'importe quelle séquence de caractères?correspond à un seul caractère (ou zéro à la fin d'un segment sans point)
dir *.txt & REM Tous les fichiers .txt
ren *.jpeg *.jpg & REM Renommage en masse
Résumé de redirection
command > file.txt & REM Écrase stdout dans le fichier
command >> file.txt & REM Ajoute stdout au fichier
command 2> errors.log & REM Rédiriger stderr
command > all.log 2>&1 & REM Fusionner stderr dans stdout
command < input.txt & REM Lire stdin depuis le fichier
command > NUL 2>&1 & REM Ignorer toute la sortie
Écrire des fichiers batch de qualité production
Structure de script standard
@echo off
setlocal EnableDelayedExpansion
REM ============================================================
REM Script: example.bat
REM Purpose: Describe what this script does
REM ============================================================
call :main %*
exit /b %ERRORLEVEL%
:main
call :parse_args %*
if not defined _TARGET (
echo ERROR: --target is required. 1>&2
call :usage
exit /b 1
)
echo Processing: %_TARGET%
exit /b 0
:parse_args
if "%~1"=="" exit /b 0
if /i "%~1"=="--target" set "_TARGET=%~2" & shift
if /i "%~1"=="--help" call :usage & exit /b 0
shift
goto :parse_args
:usage
echo Usage: %~nx0 --target ^<path^> [--help]
echo.
echo Options:
echo --target Path to process (required)
echo --help Show this help message
exit /b 0
Bonnes pratiques
- Toujours commencer par
@echo offetsetlocal— Prévient la sortie bruyante et la fuite de variables vers l'appelant. - Valider les entrées avant le traitement — Vérifier les arguments requis et l'existence des fichiers tôt. Utiliser
if not definedetif not exist. - Mettre entre guillemets les chemins et variables — Utiliser
"%~1"et"%_MY_PATH%"pour gérer en toute sécurité les espaces et les caractères spéciaux. - Utiliser
exit /bau lieu deexit— Évite de fermer la fenêtre de la console parent. - Retourner des codes de sortie significatifs —
exit /b 0pour le succès, non-zéro pour les échecs spécifiques. - Utiliser
%~dp0pour les chemins relatifs au script — Garantit que le script fonctionne quel que soit le répertoire de travail de l'appelant. - Préférer
ROBOCOPYàXCOPY— Plus fiable, supporte les retries, le mirroring et le logging. - Utiliser
EnableDelayedExpansionlors de la modification de variables dans les boucles ou les blocs entre parenthèses. - Écrire les erreurs vers stderr —
echo ERROR: message 1>&2garde stdout propre pour le piping. - Utiliser
REMpour les commentaires —::peut causer des problèmes dans les corps de bouclesFOR.
Considérations de sécurité
- Ne jamais stocker les identifiants dans les fichiers batch — Utiliser les variables d'environnement, les magasins d'identifiants ou les invites.
- Valider l'entrée de l'utilisateur — Les variables non guillemets contenant
&,|ou>peuvent injecter des commandes. Toujours mettre entre guillemets :"%_USER_INPUT%". - Utiliser
SETLOCAL— Empêche les valeurs de variables de fuir vers les processus parents. - Nettoyer les chemins de fichiers — Valider les chemins avant les passer à
DEL,RDouROBOCOPYpour prévenir la suppression involontaire. - Éviter
SET /Ppour l'entrée sensible — L'entrée est visible et stockée dans l'historique de la console. Utiliser un outil d'identifiants dédié si possible.
Débogage et dépannage
| Technique | Comment |
|---|---|
| Tracer l'exécution | Supprimer @echo off ou utiliser @echo on temporairement |
| Exécuter étape par étape | Ajouter PAUSE entre les sections |
| Vérifier le niveau d'erreur | echo Exit code: %ERRORLEVEL% après chaque commande |
| Inspecter les variables | set _MY_ pour afficher les variables commençant par _MY_ |
| Problèmes d'expansion différée | Variable à l'intérieur du bloc ( ) qui ne se met pas à jour ? Activer la syntaxe !VAR! |
%% vs % de boucle FOR |
Utiliser %%i dans les fichiers batch, %i sur la ligne de commande |
| Espaces dans SET | set name=value pas set name = value |
| Caret dans les pipes | Après un pipe, utiliser ^^^ pour échapper les caractères spéciaux |
| Parenthèses dans SET /A | Échapper avec ^( et ^) à l'intérieur des blocs if, ou utiliser des guillemets |
| Double pourcentage pour le modulo | set /a r=14 %% 3 dans les fichiers batch |
Outils multiplates-formes et étendus
Quand le scripting batch atteint ses limites, ces outils étendent les capacités de cmd.exe :
| Outil | Objectif |
|---|---|
| Cygwin | Environnement POSIX complet sur Windows (grep, sed, awk, ssh) |
| MSYS2 | Outils Unix légers et gestionnaire de paquets (pacman) |
| WSL | Windows Subsystem for Linux — exécuter les binaires Linux natifs |
| GnuWin32 | Utilitaires GNU individuels en tant qu'exécutables Windows natifs |
| PowerShell | Scripting Windows moderne avec intégration .NET |
Utiliser batch quand vous avez besoin : démarrage rapide, opérations fichiers simples, outils CLI basés sur PATH, ou intégration de Task Scheduler. Envisager PowerShell ou WSL pour le traitement de données complexes, les API REST ou le scripting orienté objet.
Raccourcis clavier CMD
| Raccourci | Action |
|---|---|
Tab |
Complément automatique des noms de fichier/dossier |
Up / Down |
Naviguer l'historique des commandes |
F7 |
Afficher la fenêtre contextuelle de l'historique des commandes |
F3 |
Répéter la dernière commande |
Esc |
Effacer la ligne actuelle |
Ctrl+C |
Annuler la commande en cours d'exécution |
Alt+F7 |
Effacer l'historique des commandes |
Fichiers de référence
Le dossier references/ contient la documentation détaillée :
| Fichier | Contenu |
|---|---|
tools-and-resources.md |
Outils Windows, utilitaires, gestionnaires de paquets, terminaux |
batch-files-and-functions.md |
Exemples de scripts, techniques, liens de bonnes pratiques |
windows-commands.md |
Référence complète A-Z des commandes Windows |
cygwin.md |
Guide utilisateur Cygwin et FAQ |
msys2.md |
Installation MSYS2, paquets et environnements |
windows-subsystem-on-linux.md |
Configuration WSL, commandes et documentation |
Modèles de ressources
Le dossier assets/ contient les données de modèle de fichier batch de démarrage, mais sous forme de fichiers texte :
| Modèle | Objectif |
|---|---|
executable.txt |
Outil CLI autonome avec analyse des arguments |
library.txt |
Bibliothèque de fonction réutilisable avec labels CALL-ables |
task.txt |
Script de tâche planifiée / automatisation |