Outils pour utilisateurs

Outils du site


obsolete:informatique:batch

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
obsolete:informatique:batch [2024/11/19 19:23] – supprimée - modification externe (Date inconnue) 127.0.0.1obsolete:informatique:batch [2024/11/20 11:48] (Version actuelle) alexis
Ligne 1: Ligne 1:
 +====== Batch ======
 +
 +===== Utiliser l'affichage =====
 +  * Activer/désactiver l'affichage
 +<code dos>
 +rem Activation
 +echo on
 +
 +rem Désactivation
 +@echo off
 +</code>
 +  * Afficher une ligne vide
 +<code dos>
 +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)
 +</code>
 +
 +===== 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.
 +<code dos>
 +rem Rechercher la chaîne "mysql" dans tous les fichiers PHP
 +dir /S /B *.php | findstr /I /M /R /F:/ mysql
 +</code>
 +Dans le cas d'une utilisation dans une boucle ''for'', il faut penser à l'échapper sous peine d'avoir une erreur.
 +<code dos>
 +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
 +)
 +</code>
 +
 +===== Boucle for =====
 +
 +==== Utilisation ====
 +  * Avec une série de valeurs
 +<code dos>
 +@echo off
 +for %%O in (1 2 3) do (
 +    rem Faire quelque chose
 +)
 +</code>
 +
 +  * Avec une série de fichiers
 +<code dos>
 +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
 +)
 +</code>
 +
 +  * Avec la sortie d'une commande
 +<code dos>
 +@echo off
 +for /F %%O in ('dir') do (
 +    rem Faire quelque chose
 +)
 +</code>
 +
 +  * En utilisant les jetons et les délimiteurs
 +<code dos>
 +@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
 +</code>
 +==== 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 :
 +<code dos>
 +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%
 +)
 +</code>
 +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 :
 +<code dos>
 +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!
 +)
 +</code>
 +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 :
 +<code dos>
 +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
 +</code>
 +===== 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 :
 +<code dos>
 +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
 +</code>
 +
 +De cette manière, il est possible de boucler sur les variables retournées et d'en extraire leur valeur. Par exemple :
 +<code dos>
 +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
 +</code>
 +
 +Pour plus d'information, voir [[http://www.robvanderwoude.com/battech_array.php|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 ((http://stackoverflow.com/a/232674))
 +  * ''| was unexpected at this time'' : c'est probablement dù au pipe qui n'est pas échappé dans une boucle ''for'' (voir l'[[obsolete:informatique:batch#utiliser_les_pipes|utilisation des pipes]])
 +===== Divers =====
 +  * Tester l'existence d'un répertoire
 +<code dos>
 +if exist %VAR%\NUL echo C'est un répertoire
 +</code>
 +  * Lire l'ensemble des paramètres
 +<code dos>
 +for %%O in (%*) do (
 +    rem Faire quelque chose
 +)
 +</code>
 +
 +===== Liens utiles =====
 +  * [[http://ss64.com/nt/|An A-Z Index of the Windows CMD command line]]
 +  * [[http://www.computerhope.com/msdos.htm|Microsoft DOS and Windows Command Line]]
 +  * [[http://www.robvanderwoude.com/batchfiles.php|Batch files]]
 +  * [[http://www.hotline-pc.org/batch.htm|Les scripts Batch et les fichiers de commande ]]