Outils pour utilisateurs

Outils du site


informatique:batch

Batch

Utiliser l'affichage

  • Activer/désactiver l'affichage
rem Activation
echo on

rem Désactivation
@echo off
  • Afficher une ligne vide
rem Première solution
echo.

rem Deuxième solution
echo[

rem Troisième solution (non recommandée)
rem Utiliser un caractère ASCII blanc (ALT+255)

Utiliser les pipes ("|")

Elles fonctionnent comme avec Bash. Elles permettent de rediriger la sortie standard d'une commande vers l'entrée standard d'une autre.

rem Rechercher la chaîne "mysql" dans tous les fichiers PHP
dir /S /B *.php | findstr /I /M /R /F:/ mysql

Dans le cas d'une utilisation dans une boucle for, il faut penser à l'échapper sous peine d'avoir une erreur.

rem L'exécution de cette syntaxe retournera l'exception "| was unexpected at this time"
for /F %%I in ('dir /S /B *.php | findstr /I /M /R /F:/ mysql') do (
    echo %%I
)

rem Il faut échapper le pipe avec le caractère "^"
for /F %%I in ('dir /S /B *.php ^| findstr /I /M /R /F:/ mysql') do (
    echo %%I
)

Boucle for

Utilisation

  • Avec une série de valeurs
@echo off
for %%O in (1 2 3) do (
    rem Faire quelque chose
)
  • Avec une série de fichiers
rem Les fichiers doivent évidemment exister pour pouvoir être manipulés
@echo off
for /F %%O in (<fichier1> <fichier2> <fichier3>) do (
    rem Faire quelque chose
)
  • Avec la sortie d'une commande
@echo off
for /F %%O in ('dir') do (
    rem Faire quelque chose
)
  • En utilisant les jetons et les délimiteurs
@echo off
rem Extraction de la date du système
rem Attention à la commande date qui renvoie un espace en fin de chaîne
for /F "tokens=1-3 delims=/ " %%A in ('date /T') do set YYYYMMDD=%%C%%B%%A

Expansion des variables

Dans une boucle for, il est normal de vouloir travailler avec des variables. Mais la manière d'interpréter le code est, de prime abord, peu intuitive. Sans connaître cette manière de faire, on va être tenté d'écrire ce genre de code :

rem La sortie sera, contre toute attente :
rem 3
rem 3
rem 3
@echo off
for %%O in (1 2 3) do (
    set OPTION=%%O
    echo %OPTION%
)

C'est dû au fait que l'expansion des variables est réalisée avant l'exécution de la boucle for et non pas pendant. Il est possible de passer outre cette limitation en utilisant la syntaxe suivante :

rem La sortie sera :
rem 1
rem 2
rem 3
@echo off
setlocal EnableDelayedExpansion
for %%O in (1 2 3) do (
    set OPTION=%%O
    echo !OPTION!
)

Il est possible de modifier les variables lors de leur expansion grâce à certains marqueurs :

Marqueur Action
%~I enlève les guillements (“) autour de %I
%~fI convertit %I en un chemin qualifié complet
%~dI convertit %I en une lettre de disque
%~pI convertit %I en un chemin seulement
%~nI convertit %I en nom de fichier seulement
%~xI convertit %I en extension seulement
%~sI convertit %I en un chemin contenant seulement des noms courts
%~aI convertit %I en attributs du fichier
%~tI convertit %I en date et heure du fichier
%~zI convertit %I en taille du fichier
%~$PATH:I recherche dans la liste des répertoires définis dans la variable d'environnement PATH et convertit %I en un chemin qualifié complet de la première occurence trouvée. Si le nom de la variable d'environnement n'est pas défini, alors %I est convertit en chaîne vide.

Il est possible de combiner ces marqueurs. Par exemple :

rem Convertit %I en lettre de disque et chemin
%~dpI

rem Convertit %I en nom de fichier et extension
%~nxI

rem Convertit %I en chemin complet avec noms courts
%~fsI

Utiliser un tableau

Les tableaux n'existent pas. Cependant, il est possible de détourner l'usage des variables pour qu'elles fonctionnent comme un tableau associatif. En effet, si l'on cré des variables commençant de la même façon, il est possible de les récupérer et de les lire séquentiellement. Pour une utilisation et une compréhension aisée, il est recommandé de nommer ces variables __<nom du tableau>.<nom de l'index>. Par exemple :

rem Affectation des variables
set __TYPE.1=php
set __TYPE.2=yml
set __TYPE.3=ini

rem Affichage des variables
set __TYPE.
rem La commande précédente affiche :
rem __TYPE.1=php
rem __TYPE.2=yml
rem __TYPE.3=ini

De cette manière, il est possible de boucler sur les variables retournées et d'en extraire leur valeur. Par exemple :

rem En utilisant les variables définies précédemment
for /F "tokens=2* delims==" %%I in ('set __TYPE.') do (
    echo %%I
)
rem La commande précédente affiche :
rem php
rem yml
rem ini

Pour plus d'information, voir ici.

Erreurs

  • The system cannot find the batch label specified : c'est probablement dù au caractère de fin de ligne qui n'est pas celui attendu 1)
  • | was unexpected at this time : c'est probablement dù au pipe qui n'est pas échappé dans une boucle for (voir l'utilisation des pipes)

Divers

  • Tester l'existence d'un répertoire
if exist %VAR%\NUL echo C'est un répertoire
  • Lire l'ensemble des paramètres
for %%O in (%*) do (
    rem Faire quelque chose
)

Liens utiles

informatique/batch.txt · Dernière modification : 2023/08/30 17:27 de alexis