Nous sommes en *Insérer l'année en cours* et j'utilise toujours le Batch pour automatiser des choses sous Windows. Pourquoi ? Parce que je suis une quiche en programmation, que je connais relativement pas trop mal les commandes DOS et que ça me permet d'aller vite. Alors oui, Powershell c'est plus mieux mais bon hein voila quoi.
Je vais donc compiler ici des petits bouts de codes qui peuvent servir dans pas mal de cas de figures ou tout simplement simplifier la vie. Malheureusement je n'ai plus la source pour la plus part que je n'ai pas trouvé par moi même, mais ce doit être de formidables personnes sur Stackoverflow ou sites dérivés (Super User, Server Fault… ).
CHCP 65001 > NUL
Un menu simple à choix multiples en cas d'erreur pour une mauvaise saisie.
SET /P CHOICE=Choix ? IF /I "%CHOICE%"=="1" (GOTO CHOIX1) IF /I "%CHOICE%"=="2" (GOTO CHOIX2) IF /I "%CHOICE%" GTR "2" (GOTO ERREUR)
FOR /R %%f IN (NOMFICHIER*.machin) DO SET NOMVARIABLE="%%~nxf"
Une autre solution pour formater la date au format JJMMAAAA (ou JJ-MM-AAAA) est disponible plus bas : Formater la date
Par exemple pour la mettre dans un nom de fichier.
%date:~-4,4%%date:~-7,2%%date:~-10,2%
Exemple :
Nomfichier_%date:~-4,4%%date:~-7,2%%date:~-10,2%
Deux possibilités de conditions :
IF EXIST fichier.exe (ECHO Le fichier existe)
ou
IF EXIST fichier.exe ( ECHO Le fichier existe ) ELSE ( ECHO Le fichier n'existe pas )
RUNDLL32 PRINTUI.DLL,PrintUIEntry /y /n "Nom complet de l'imprimant dans Windows"
Par extension, un petit script pour attribuer un imprimante par défaut selon le nom du poste :
REM On récupère le nom du poste SET Nom_PC=%COMPUTERNAME% REM On définit le nom des imprimantes SET ImpSalle1="Ricoh Machin PCL6" SET ImpSalle2="Xerox Truc Bidule PS" IF /I "%NOM_PC:~0,3"%=="MIC" SET Printer=Salle1 IF /I "%NOM_PC:~0,4"%=="PORT" SET Printer=Salle2 IF /I "%Printer%"=="CDI" SET RUNDLL32 PRINTUI.DLL,PrintUIEntry /y /n %Salle1% ) ELSE ( GOTO SALLE2 ) :SALLE2 RUNDLL32 PRINTUI.DLL,PrintUIEntry /y /n %Salle2% ) ELSE ( GOTO EOF )
C'est sale mais dans un réseau à la noix, sans domaine, avec juste un script de netlogon ça fonctionne.
WMIC computersystem where caption='%computername%' rename Nouveau_Nom_du_PC
Ici Il s'agit de rajouter 3 chiffres au nom du poste. Ex : MIC-xxx2019
SET nom1=MIC- SET nom2=2019 :Saisie SET /p nb="Saisie le numero du poste : " FOR /F "tokens=1* delims=0123456789" %%a IN ("A0%nb:"=%") DO ( IF NOT "%%b"=="" ( ECHO Uniquement des chiffres ! GOTO Saisie ) ) IF "!nb:~3!"=="" IF NOT "!nb:~2!"=="" ( REM Conditions ok donc on continue GOTO Check ) ELESE ( ECHO 3 caractères mini et max ! GOTO Saisie ) :Check SET nom_ok=%nom1%%nb%%nom2% REM On pinge pour voir si le poste existe déjà sur le réseau ECHO Le numero nom du poste est %nom_ok% PING -n 1 %nom_ok% | findstr /r /c:"[0-9] *ms" > NUL IF %errorlevel% == 0 ( ECHO Le poste %nom_ok% existe deja. Vérifier ! ECHO. GOTO Saisie ) ELSE ( ECHO Nommage du poste en %nom_ok% WMIC computersystem where caption='%computername%' rename %nom_ok% > NUL GOTO Comptes )
Parce que je ne m'en rappelle jamais, j'sais pas pourquoi.
XCOPY dossier_source dossier\destination /S /Y
XCOPY fichier_source.machin fichier_destination.machin /Y
RMDIR nom_du_dossier /S /Q
SETLOCAL enabledelayedexpansion SET var[0]=Valeur1 SET var[1]=Valeur2 SET var[2]=Valeur3 SET var[3]=Valeur4
FOR /L %%n in (0,1,%boucle%) DO ( ECHO Liste des valeurs : !var[%%n]! )
SETLOCAL enabledelayedexpansion SET day[0]=MON SET day[1]=TUE SET day[2]=WED SET day[3]=THU SET day[4]=FRI SET day[5]=SAT SET day[6]=SUN FOR /L %%n in (0,1,%boucle%) DO ( ECHO !day[%%n]! )
Ce petit bout de code qui va supprimer les fichiers d'un dossier qui sont plus vieux que le nombre défini de jours.
Il suffit de modifier la valeur des variables des trois premières lignes pour définir le dossier, le nombre de jour et l'extension des fichiers à supprimer.
SET folder=C:\DOSSIER\Bidule SET days=15 SET ext=zip FORFILES /P "%folder%" /S /M *.%ext% /D -%days% /C "CMD /C del @path ECHO Suppression des fichier %ext% du dossier %folder% de plus de %days% jours... PING localhost -n 5 > NUL
Sinon, juste la ligne sans tout le blabla autour.
FORFILES /P "C:\DOSSIER\Bidule" /S /M *.zip /D -15 /C "CMD /C del @path
TASKKILL /F /IM processus.exe
Du coup, on peut faire un truc du genre :
TASKLIST /FI "IMAGENAME eq machin.exe" 2>NUL | find /I /N "machin.exe">NUL IF "%ERRORLEVEL%"=="0" ( TASKKILL /F /IM machin.exe > NUL ) ELSE ( ECHO Machin pas lancé n'est pas lancé. )
La variable d'environnement %date% renvoie, par défaut, la date au format JJ/MM/AAAA. Si on veut utiliser cette variable pour, par exemple, créer un dossier il faut la formater dans les slash.
%date:/=-% Retourne : JJ-MM-AAAA %date:/=_% Retourne : JJ_MM_AAAA Par exemple mkdir prout\%date:/=-% Retourne un dossier prout\JJ-MM-AAAA
Au format ISO 8601 :
%date:~6,4%-%date:~3,2%-%date:~0,2%
Source : https://itectec.com/superuser/adding-day-of-week-to-file-name-in-batch-file/
@ECHO OFF for /F "tokens=2 skip=2 delims=," %%D in ('WMIC Path Win32_LocalTime Get DayOfWeek /Format:csv') do @set day=%%D IF %day%==1 SET jour=lundi IF %day%==2 SET jour=mardi IF %day%==3 SET jour=mercredi IF %day%==4 SET jour=jeudi IF %day%==5 SET jour=vendredi IF %day%==6 SET jour=samedi IF %day%==7 SET jour=dimanche ECHO Jour : %jour% PAUSE
Source : https://stackoverflow.com/questions/9171774/batch-file-getting-ip-from-ping-command
FOR /f "tokens=1,3 delims=: " %%A IN ('ping -n 1 fr.wikipedia.org') DO IF %%A==Réponse SET IP=%%B ECHO %IP%
Le fichier texte contenant, par exemple, des noms d'utilisateurs :
rodrigue chimène elvire diègue
Le script :
SET list=usernames.txt SET folder=D:\utilisateurs FOR /F %%n IN (%list%) DO MKDIR %folder%\%%n
Un peu plus sophistiqué, on vérifie si le dossier de destination existe. Sinon on le créé :
SET list=usernames.txt SET folder=D:\utilisateurs IF EXIST %folder% ( GOTO CREATE ) ELSE ( MKDIR %folder% GOTO CREATE ) :CREATE FOR /F %%n IN (%list%) DO MKDIR %folder%\%%n
Depuis 2019 Windows inclue libarchive (et curl). On peut compresser directement en ligne de commande sans installer de logiciels supplémentaires.
tar -a -c -f archive.zip fichier_ou_dossier_a_compresser