Aide-mémoire Script Batch DOS/Windows
Structure et Entêtes
ObjectifCommande
Entête recommandée @ECHO OFF
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
TITLE Mon Script
CHCP 65001 >NUL  :: UTF-8 (ou 1252 pour ANSI)
Commentaires :: Ceci est un commentaire (recommandé)
REM Ceci est aussi un commentaire
:: Les :: ne peuvent pas être dans un bloc (IF/FOR) → utiliser REM
Désactiver/activer l'écho @ECHO OFF  :: masque toutes les commandes
ECHO ON    :: réaffiche les commandes
@          :: masque une seule ligne
Code de retour EXIT /B 0        :: quitter le script (succès)
EXIT /B 1        :: quitter avec erreur
ECHO %ERRORLEVEL% :: afficher le code retour de la dernière commande
Pause et nettoyage PAUSE            :: Appuyez sur une touche...
CLS              :: vider l'écran
TIMEOUT /T 5     :: pause 5 secondes
TIMEOUT /T 5 /NOBREAK :: pause non interruptible
Variables et Environnement
Déclarer et utiliser SET nom=Jean
SET /A compteur=42
ECHO %nom%      :: affiche Jean
ECHO %compteur% :: affiche 42
Arithmétique (SET /A) SET /A result=5+3
SET /A result=%nb%*2
SET /A result=%nb%/2
SET /A result=%nb% %% 3  :: modulo
SET /A nb+=1            :: incrément
SET /A nb-=1
Saisie utilisateur SET /P nom=Entrez votre nom :
ECHO Bonjour %nom%
Variables d'environnement utiles %USERPROFILE%  :: C:\Users\Jean
%USERNAME%     :: Jean
%COMPUTERNAME% :: NOM-PC
%WINDIR%       :: C:\Windows
%TEMP%         :: dossier temporaire
%DATE%         :: date courante
%TIME%         :: heure courante
%CD%           :: dossier courant
%~dp0          :: dossier du script lui-même
%~nx0          :: nom du script avec extension
%0 %1 %2 ...   :: arguments du script
Expansion différée (!var!) SETLOCAL ENABLEDELAYEDEXPANSION
SET count=0
FOR %%i IN (a b c) DO (
  SET /A count+=1
  ECHO !count!  :: utiliser ! au lieu de % dans les blocs
)
Effacer une variable SET nom=    :: assigner vide pour supprimer
Lister les variables d'environnement SET         :: toutes les variables
SET PATH    :: variables commençant par PATH
Entrée / Sortie et Redirection
Afficher du texte ECHO Bonjour le monde
ECHO.                   :: ligne vide
ECHO &ECHO.              :: ligne vide dans un bloc
Redirection commande > fichier.txt    :: écrire (écrase)
commande >> fichier.txt   :: ajouter
commande 2> erreurs.txt  :: stderr vers fichier
commande 2>&1            :: stderr vers stdout
commande > NUL           :: supprimer la sortie
commande > NUL 2>&1      :: supprimer tout
Pipe et enchaînement commande1 | commande2    :: pipe
commande1 & commande2    :: toujours exécuter les deux
commande1 && commande2   :: exécuter 2 si 1 réussit
commande1 || commande2   :: exécuter 2 si 1 échoue
Conditions (IF)
Comparer des chaînes IF "%var%"=="valeur" ECHO égal
IF /I "%var%"=="valeur" ECHO égal ignorer casse
IF NOT "%var%"=="valeur" ECHO différent
IF "%var%"=="" ECHO variable vide
Comparer des nombres IF %nb% EQU 5 ECHO égal
IF %nb% NEQ 5 ECHO différent
IF %nb% GTR 5 ECHO plus grand
IF %nb% GEQ 5 ECHO plus grand ou égal
IF %nb% LSS 5 ECHO plus petit
IF %nb% LEQ 5 ECHO plus petit ou égal
Tester l'existence IF EXIST fichier.txt ECHO existe
IF NOT EXIST fichier.txt ECHO absent
IF EXIST dossier\ ECHO dossier existe  :: noter le \
Tester ERRORLEVEL IF %ERRORLEVEL% EQU 0 ECHO succès
IF %ERRORLEVEL% NEQ 0 GOTO :erreur
commande && ECHO OK || ECHO KO
Bloc IF / ELSE IF "%var%"=="oui" (
  ECHO oui
  SET autre=ok
) ELSE (
  ECHO non
)
Boucles (FOR)
Parcourir une liste FOR %%i IN (a b c) DO ECHO %%i
FOR %%f IN (*.txt) DO ECHO %%f
Boucle numérique (FOR /L) FOR /L %%i IN (1,1,10) DO ECHO %%i  :: de 1 à 10, pas 1
FOR /L %%i IN (0,2,20) DO ECHO %%i  :: 0 2 4 ... 20
FOR /L %%i IN (10,-1,1) DO ECHO %%i :: compte à rebours
Parcourir des fichiers récursivement (FOR /R) FOR /R "C:\dossier" %%f IN (*.log) DO (
  ECHO %%f
)

FOR /R %%f IN (*) DO ECHO %%~nxf :: nom+extension seulement
Parcourir des dossiers (FOR /D) FOR /D %%d IN (*) DO ECHO %%d
FOR /D /R %%d IN (*) DO ECHO %%d :: récursif
Lire un fichier ligne par ligne (FOR /F) FOR /F "delims=" %%l IN (fichier.txt) DO ECHO %%l
FOR /F "tokens=1,2 delims=," %%a IN (data.csv) DO (
  ECHO col1=%%a col2=%%b
)
FOR /F "skip=1 tokens=*" %%l IN (fichier.txt) DO ...
FOR /F "usebackq delims=" %%l IN ("fichier avec espaces.txt") DO ...
Parser la sortie d'une commande FOR /F "tokens=*" %%l IN ('dir /b *.txt') DO ECHO %%l
FOR /F "tokens=2 delims==" %%v IN ('SET COMPUTERNAME') DO SET machine=%%v
Modificateurs de variable FOR %%~f  :: chemin complet : C:\dossier\fichier.txt
%%~d  :: lecteur : C:
%%~p  :: chemin sans lecteur : \dossier\
%%~n  :: nom sans extension : fichier
%%~x  :: extension : .txt
%%~nx :: nom + extension : fichier.txt
%%~dp :: lecteur + chemin : C:\dossier\
%%~z  :: taille du fichier en octets
%%~t  :: date/heure du fichier
Sous-routines et Fonctions
GOTO et labels GOTO :suite
ECHO cette ligne est sautée
:suite
ECHO on est ici
Sous-routine avec CALL CALL :maFonction param1 param2
ECHO retour dans le flux principal
GOTO :EOF

:maFonction
ECHO arg1=%~1 arg2=%~2
SET /A resultat=%~1+%~2
EXIT /B 0
Appeler un autre script CALL autreScript.bat
CALL autreScript.bat param1 param2
CALL "%~dp0autreScript.bat"  :: chemin relatif au script courant
Arguments de sous-routine %~1 %~2 ... %~9  :: arguments de la sous-routine
%~0             :: nom de la sous-routine
SHIFT           :: décaler les arguments (%1 <- %2, etc.)
Retourner une valeur :calculer
SET /A %~3=%~1+%~2  :: stocker résultat dans var nommée par %3
EXIT /B 0

CALL :calculer 10 20 resultat
ECHO Résultat : %resultat%
Manipulation de Chaînes
Extraire une sous-chaîne SET str=Bonjour
ECHO %str:~0,3%  :: Bon (position 0, 3 chars)
ECHO %str:~3%    :: jour (à partir de la position 3)
ECHO %str:~-3%   :: our (3 derniers caractères)
ECHO %str:~0,-3%  :: Bonj (tout sauf les 3 derniers)
Remplacer dans une chaîne SET str=Hello World
ECHO %str:World=BAT%   :: Hello BAT
ECHO %str: =_%        :: Hello_World

:: Supprimer des espaces (remplacer par rien)
SET clean=%str: =%
Longueur d'une chaîne (astuce) SET str=Bonjour
SET len=0
:loop_len
IF "!str:~%len%,1!"=="" GOTO :fin_len
SET /A len+=1
GOTO :loop_len
:fin_len
ECHO Longueur : %len%
Minuscule / Majuscule (PowerShell) :: Batch pur ne supporte pas nativement la conversion de casse
FOR /F %%v IN ('powershell -c "'hello'.ToUpper()"') DO SET upper=%%v
FOR /F %%v IN ('powershell -c "'HELLO'.ToLower()"') DO SET lower=%%v
Extraire date/heure :: %DATE% = ex. 22/02/2026 (dépend des paramètres régionaux)
FOR /F "tokens=1-3 delims=/" %%a IN ("%DATE%") DO (
  SET jour=%%a & SET mois=%%b & SET annee=%%c
)

:: %TIME% = ex. 14:30:05,00
FOR /F "tokens=1-3 delims=:," %%a IN ("%TIME%") DO (
  SET hh=%%a & SET mm=%%b & SET ss=%%c
)

:: Horodatage pour nommage de fichier
SET ts=%annee%-%mois%-%jour%_%hh%h%mm%
Commandes Fichiers et Dossiers
Navigation CD chemin         :: changer de dossier
CD /D D:\data     :: changer lecteur ET dossier
PUSHD chemin      :: sauvegarder le CD courant
POPD              :: restaurer le CD précédent
CD ..             :: remonter d'un niveau
Lister DIR                :: liste standard
DIR /B             :: bare (noms seulement)
DIR /B /S *.log    :: récursif, noms seulement
DIR /A:H           :: fichiers cachés
DIR /O:D           :: triés par date
Copier COPY src dest      :: copier un fichier
COPY *.txt dest\   :: copier des fichiers
XCOPY src dest /E /I /Y  :: copier dossier récursif
      :: /E=sous-dossiers vides, /I=dest=dossier, /Y=sans demande
ROBOCOPY src dest /MIR   :: miroir (synchronisation)
ROBOCOPY src dest /E /LOG:rapport.txt
Déplacer / Renommer MOVE source dest    :: déplacer ou renommer
REN fichier.txt fichier.bak :: renommer
RENAME *.txt *.bak  :: renommer en masse
Supprimer DEL fichier.txt    :: supprimer un fichier
DEL /F fichier     :: forcer suppression fichier en lecture seule
DEL /Q *.tmp       :: silencieux
DEL /S /Q *.log    :: récursif
RMDIR dossier /S /Q :: supprimer dossier et contenu
Créer des dossiers MKDIR dossier      :: créer un dossier
MD dossier\sous\sous2  :: créer l'arborescence (0)
Attributs et permissions ATTRIB +H fichier   :: rendre caché
ATTRIB -H fichier   :: enlever caché
ATTRIB +R fichier   :: lecture seule
ICACLS dossier /grant "Utilisateurs:F" :: donner contrôle total
Lire et écrire des fichiers TYPE fichier.txt            :: afficher contenu
MORE fichier.txt            :: paginer
ECHO ligne > fichier.txt     :: créer / écraser
ECHO autre ligne >> fichier.txt :: ajouter
ECHO.>> fichier.txt           :: ajouter ligne vide

:: Créer un fichier vide
TYPE NUL > fichier.txt
COPY NUL fichier.txt
Trouver du texte FIND "texte" fichier.txt      :: chercher chaîne
FIND /I "texte" fichier.txt   :: insensible à la casse
FIND /V "texte" fichier.txt   :: lignes NE contenant PAS
FIND /C "texte" fichier.txt   :: compter les occurrences
FINDSTR "regex" fichier.txt   :: avec expressions régulières
FINDSTR /S "texte" *.txt      :: récursif
FINDSTR /I /R "er[re]ur" *.log :: regex insensible casse
Comparer des fichiers FC fichier1.txt fichier2.txt :: comparer texte
FC /B fichier1 fichier2     :: comparer binaire
COMP fichier1 fichier2      :: comparaison binaire
Gestion des Processus
Lancer un programme START programme.exe            :: lancer en arrière-plan
START "" "C:\prog.exe" arg
START /WAIT programme.exe      :: attendre la fin
START /MIN programme.exe       :: fenêtre réduite
START /MAX programme.exe       :: fenêtre maximisée
CALL programme.exe             :: lancer et attendre
Lister les processus TASKLIST                      :: liste tous les processus
TASKLIST /FI "IMAGENAME eq notepad.exe" :: filtrer
TASKLIST | FIND "chrome"
Tuer un processus TASKKILL /IM notepad.exe       :: par nom
TASKKILL /IM notepad.exe /F    :: forcer
TASKKILL /PID 1234             :: par PID
TASKKILL /F /IM chrome.exe /T  :: avec les processus enfants
Services Windows SC QUERY                      :: lister les services
SC QUERY nom_service          :: état d'un service
NET START nom_service         :: démarrer
NET STOP nom_service          :: arrêter
SC START nom_service
SC STOP nom_service
SC CONFIG nom_service start=auto
Tâches planifiées SCHTASKS /CREATE /TN "MonTask" /TR "C:\script.bat" /SC DAILY /ST 08:00
SCHTASKS /RUN /TN "MonTask"
SCHTASKS /DELETE /TN "MonTask" /F
SCHTASKS /QUERY /TN "MonTask"
Réseau
Informations réseau IPCONFIG             :: interfaces réseau
IPCONFIG /ALL        :: détails complets
IPCONFIG /FLUSHDNS   :: vider le cache DNS
IPCONFIG /RENEW      :: renouveler bail DHCP
NETSTAT -AN          :: connexions actives
NETSTAT -ANO         :: avec PID
NETSTAT -AN | FIND ":80"
Ping et diagnostic PING hostname
PING -n 4 hostname   :: 4 paquets
PING -t hostname     :: continu (Ctrl+C pour arrêter)
TRACERT hostname
PATHPING hostname
NSLOOKUP hostname
NSLOOKUP hostname 8.8.8.8 :: avec serveur DNS
Partages réseau NET SHARE                   :: partages locaux
NET USE Z: \\serveur\partage :: connecter un lecteur réseau
NET USE Z: /DELETE         :: déconnecter
NET USE * /DELETE /Y       :: déconnecter tous
NET USE Z: \\srv\share /USER:dom\user mdp
Pare-feu NETSH ADVFIREWALL FIREWALL ADD RULE NAME="HTTP" DIR=IN ACTION=ALLOW PROTOCOL=TCP LOCALPORT=80
NETSH ADVFIREWALL FIREWALL DELETE RULE NAME="HTTP"
NETSH ADVFIREWALL SET ALLPROFILES STATE ON
NETSH ADVFIREWALL SET ALLPROFILES STATE OFF
Téléchargement (PowerShell) powershell -c "Invoke-WebRequest -Uri 'https://url' -OutFile 'fichier'"
powershell -c "(New-Object Net.WebClient).DownloadFile('https://url','dest')"
Registre Windows
Lire une clé REG QUERY "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion" /v ProgramFilesDir
REG QUERY "HKCU\Software\monapp" :: liste les valeurs d'une clé
Créer / modifier une valeur REG ADD "HKCU\Software\monapp" /v MaCle /t REG_SZ /d "valeur" /f
REG ADD "HKCU\Software\monapp" /v Compteur /t REG_DWORD /d 1 /f

:: Types : REG_SZ (chaîne), REG_DWORD (entier),
:: REG_EXPAND_SZ (chaîne avec %var%), REG_BINARY, REG_MULTI_SZ
Supprimer une valeur / clé REG DELETE "HKCU\Software\monapp" /v MaCle /f
REG DELETE "HKCU\Software\monapp" /f  :: supprimer toute la clé
Exporter / Importer REG EXPORT "HKCU\Software\monapp" sauvegarde.reg
REG IMPORT sauvegarde.reg
Lire dans un script FOR /F "tokens=3" %%v IN ('REG QUERY "HKCU\Software\monapp" /v MaCle 2^>NUL') DO SET valeur=%%v
ECHO Valeur : %valeur%
Couleurs et Interface
Couleur du terminal COLOR 0A          :: fond noir (0), texte vert clair (A)
COLOR F0          :: fond blanc (F), texte noir (0)
COLOR              :: reset couleur par défaut

:: 0=Noir 1=Bleu 2=Vert 3=Cyan 4=Rouge 5=Magenta
:: 6=Jaune 7=Gris clair 8=Gris foncé 9=Bleu clair
:: A=Vert clair B=Cyan clair C=Rouge clair D=Rose
:: E=Jaune clair F=Blanc
Titre de la fenêtre TITLE Mon Script en cours d'exécution...
TITLE Traitement : %fichier%
Taille de la fenêtre MODE CON COLS=120 LINES=40 :: 120 colonnes, 40 lignes
Barre de progression (simulée) :progress
SET /A pct=%current%*100/%total%
ECHO [%current%/%total%] %pct%%%
:: astuce : utiliser ECHO | SET /P = ... pour rester sur la même ligne
SET /P =Traitement en cours...<NUL
Son (beep) :: Émettre un bip (caractère BEL = 0x07)
powershell -c "[console]::beep(800,500)" :: fréquence Hz, durée ms
Astuces et Bonnes Pratiques
Vérifier droits administrateur NET SESSION >NUL 2>&1
IF %ERRORLEVEL% NEQ 0 (
  ECHO Ce script nécessite des droits administrateur.
  EXIT /B 1
)
Se placer dans le dossier du script CD /D "%~dp0"
Journalisation dans un fichier log SET LOGFILE=%~dp0script.log
ECHO. > "%LOGFILE%"

:log
ECHO [%DATE% %TIME%] %~1 >> "%LOGFILE%"
ECHO %~1
EXIT /B

CALL :log "Démarrage du script"
CALL :log "Traitement terminé"
Gestion des erreurs COPY source.txt dest.txt
IF %ERRORLEVEL% NEQ 0 (
  ECHO ERREUR : copie échouée
  GOTO :erreur
)
`
GOTO :fin

:erreur
ECHO Une erreur s'est produite.
EXIT /B 1

:fin
ECHO Terminé avec succès.
EXIT /B 0
Élévation automatique (UAC) :: En début de script - relancer en admin si besoin
NET SESSION >NUL 2>&1
IF %ERRORLEVEL% NEQ 0 (
  powershell -c "Start-Process '%~f0' -Verb RunAs"
  EXIT /B
)
Empêcher les exécutions multiples SET LOCKFILE=%TEMP%\%~n0.lock
IF EXIST "%LOCKFILE%" (
  ECHO Script déjà en cours d'exécution. Abandon.
  EXIT /B 1
)
ECHO %DATE% %TIME% > "%LOCKFILE%"
:: ... corps du script ...
DEL "%LOCKFILE%"
Nettoyage à la sortie (ENDLOCAL) SETLOCAL
SET tempvar=valeur locale
:: ... traitement ...
ENDLOCAL :: toutes les variables locales sont supprimées

:: Conserver une valeur après ENDLOCAL
ENDLOCAL & SET resultat=%resultat%
Appeler PowerShell depuis un BAT powershell -ExecutionPolicy Bypass -File "script.ps1"
powershell -c "Get-Date -Format 'yyyy-MM-dd'"
powershell -c "Write-Host 'Bonjour depuis PS'"

:: Récupérer la sortie PowerShell
FOR /F %%v IN ('powershell -c "Get-Date -Format yyyy-MM-dd"') DO SET date=%%v
Encodage et caractères spéciaux CHCP 65001      :: UTF-8
CHCP 1252       :: Windows-1252 (ANSI français)
CHCP 850        :: OEM (historique DOS)

:: Caractères à échapper avec ^
^ & | < > ( )  :: utiliser ^& ^| ^< ^> ^( ^)
ECHO ^& ^ ^| ^< ^>