Site Tools


informatique:windows:batch

Astuces diverses en Batch

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… ).

Code en vrac

Passer en UTF-8

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)

Trouver un fichier avec un nom partiel et mettre son nom complet dans une variable :

FOR /R %%f IN (NOMFICHIER*.machin) DO SET NOMVARIABLE="%%~nxf"

Afficher la date du jour format AAAAMMJJ

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%

Vérifier qu'un fichier existe

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
)

Paramétrer une imprimante par défaut

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.

Changer le nom du PC

WMIC computersystem where caption='%computername%' rename Nouveau_Nom_du_PC

Changer le nom d'un PC selon une nomenclature

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
)

Les commandes simples dont je ne rappelle jamais des arguments

Parce que je ne m'en rappelle jamais, j'sais pas pourquoi.

Copie d'un dossier avec xcopy

XCOPY dossier_source dossier\destination /S /Y

Copie d'un fichier avec xcopy

XCOPY fichier_source.machin fichier_destination.machin /Y

Suppression d'un dossier non vide

RMDIR nom_du_dossier /S /Q

Faire un tableau

Définir le tableau

SETLOCAL enabledelayedexpansion 
SET var[0]=Valeur1
SET var[1]=Valeur2
SET var[2]=Valeur3
SET var[3]=Valeur4

Boucle pour lire le tableau

FOR /L %%n in (0,1,%boucle%) DO (
	ECHO Liste des valeurs : !var[%%n]!
)

Exemple :

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]!
)

Supprimer des fichier plus vieux que x jours

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

Tuer un processus

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é.
)

Formater la date

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%

Récupérer le jour de la semaine

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

http://brisray.com/computers/batch-volume.htm

Récupérer une IP depuis un ping

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%

Créer des dossiers d'après un fichier txt

Le fichier texte contenant, par exemple, des noms d'utilisateurs :

usernames.txt
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

Compresser

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
informatique/windows/batch.txt · Last modified: 2024/11/13 09:23 by yahiko