Aide-mémoire Script Batch DOS/Windows
| Structure et Entêtes |
| Objectif | Commande |
| 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 ^& ^ ^| ^< ^> |