un grand merci à Karzoff pour sa relecture et sa mise en page
Salut,
J'espère que ce petit HowTo aidera quelqu'un... Il faut noter que je n'ai parlé ni des paramètres, ni des variables de la boucle FOR. Ceci dit, je vous souhaite une bonne lecture et surtout de bons tests :mrgreen:;)
==> EDIT: ce post sera mis à jour
- Affectation de variables :
Contrairement à beaucoup d'autres langages de scripts, il n y a pas
beaucoup de restrictions dans le référencement des variables:
- Pas besoin de différencier le type STRING du type NUMBER par des doubles quotes.
- Peu de restrictions dans le nommage des variables
- ..etc.
La taille maximale d'une variable d'environnement est 8 192 octets.
- La commande SET
Pour créer une variable on doit utiliser la commande SET /?
"SET" sans paramètres affiche les variables d'environnement non-dynamiques
La commande "SET" permet d'afficher/modifier/supprimer des variables.- Opérateur d'affectation :
L'opérateur d'affectation est le caractère '=' pour une chaîne de caractères, les autres opérateurs d'affectations (raccourcis) sont utilisés dans le cas de calculs numériques (voir SET /?).
[ += -= %= |= &= *= /= ^= ..etc ]
Pour une chaîne de caractères:Code:
1
2
3 SET VARIABLE=VALEUR ECHO %VARIABLE%
Code:
1
2
3
4 SET VARIABLE=VALEUR SET VARIABLE=2 ECHO %VARIABLE%
Code:
1
2
3
4 SET VAR=VALEUR SET RAV=%VAR% ECHO %RAV%
Pour une expression numérique à évaluer:Code:
1
2
3
4
5 SET VAR=2 SET RAV=VALEUR SET RAVAR=%RAV% %VAR% ECHO %RAVAR%
Résultat:Code:
1
2
3
4
5
6
7
8
9
10
11
12 @ECHO OFF SET/AA=1,B=400,C=10 :GOTO TRAITEMENT SET {+}=%{+}% %A% SET {/}=%{/}% %B% SET {-}=%{-}% %C% sET/AA+=1,B/=2,C-=1 IF %A% LEQ 10 GOTO:GOTO BOUCLE SET { PAUSE
Code:
1
2
3
4
5
6 {+}= 1 2 3 4 5 6 7 8 9 10 {-}= 10 9 8 7 6 5 4 3 2 1 {/}= 400 200 100 50 25 12 6 3 1 0
- Différenciation majuscule/minuscule
Les variables ne sont pas sensibles à la casse (les majuscules et les
minuscules ne sont pas différenciées "A = a")
Code:
1
2
3 SET _VAR=TEST 1 ECHO %_VAR% = %_var% = %_VaR%
- Espace entre la variable et sa valeur
Si le nom de la variable n'est pas collé au signe "="
l'appel de cette variable n'est plus:
mais plutôt:Code:ECHO %Nom_De_La_Variable%
voici un exemple concret:Code:ECHO %Nom_De_La_variable_+_Nombres_D'espaces jusqu'au signe égal%
Code:
1
2
3
4
5
6
7 SET _VARa=TEST 2 ECHO [%_VARa%] SET _VARb = TEST 2 ECHO [%_VARb%] SET _VARc = TEST 2 ECHO [%_VARc %]
Code:
1
2
3
4
5
6 Output [TEST 2] [] [ TEST 2]
- Nommage de variables avec espaces
On peut créer des variable dont le nom comporte des espaces.
Le seul problème réside dans le test de définition de la variable.Code:
1
2
3
4 SET MA VARIABLE=TEST 3 SET MA VARIABLE ECHO %MA VARIABLE%
Avec ce code IF DEFINED va testez l'existence d'une variable "MA"Code:
1
2 IF DEFINED MA VARIABLE (ECHO %MA VARIABLE%)
si elle est présente la syntaxe deviendra incorrecte puisque VARIABLE
n'a rien à faire ici "l'instruction attend une action"
une des solutions possibles consiste en l'encadrement de l'instruction par des doubles quotes
Code:
1
2
3 SET ""MA VARIABLE"=BONJOUR MAITRE" IF DEFINED "MA VARIABLE" (ECHO %"MA VARIABLE"%) ELSE (ECHO NON DEFINIE)
On peut aussi utiliser une autre variable :
Code:
1
2
3
4 SET MA VARIABLE=TEST 3 SET MA.VARIABLE=%MA VARIABLE% IF DEFINED MA.VARIABLE (ECHO %MA.VARIABLE%)
- Nommage des variables avec des caractères spéciaux
Possibilité d'utiliser dans les noms des variables, des caractères spéciaux au delà de [a-zA-Z,_]
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 SETLOCAL ENABLEEXTENSIONS SET -=VALEUR 1 SET #=VALEUR 2 SET @=VALEUR 3 SET $=VALEUR 4 SET /=VALEUR 5 SET \=VALEUR 6 SET ]=VALEUR 7 SET [=VALEUR 8 SET +=VALEUR 9 SET '=VALEUR 10 FOR %%! in (- # @ $ / \ ] [ + ') do SET %%! REM # REM # POUR UTILISER DES NOMBRES PROPREMENT REM # ON DOIT ACTIVER L'(ERV) REM # ENDLOCAL & SETLOCAL ENABLEDELAYEDEXPANSION SET 0=VALEUR SET 1=11 SET 3=!0! !1! SET 3 ECHO !0! !1! ENDLOCAL
- Suppression des variables
On peux supprimer les variables en utilisant cette syntaxe: SET MA.VARIABLE=
exemple:
Résultat:Code:
1
2
3
4
5 SET MA.VARIABLE=HELLO SET MA.VARIABLE SET MA.VARIABLE= SET MA.VARIABLE
deux méthodes nous sont offerts pour supprimer nos variables.Code:
1
2
3 MA.VARIABLE=HELLO La variable d'environnement MA.VARIABLE n'est pas d‚finie.
- Ancienne méthode
Résultat:Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 SET VAR1=SITE: SET VAR2=Developpez.net SET VAR3=FORUM: SET VAR4=Script Batch/PowerShell ECHO 1- %VAR1% %VAR2% %VAR3% %VAR4% SET VAR1= SET VAR2= SET VAR3= SET VAR4= ECHO 2- %VAR1% %VAR2% %VAR3% %VAR4%
Cette méthode n'est presque plus utiliser sauf pour des cas particuliers.Code:
1
2
3
4
5 1- SITE: Developpez.net FORUM: Script Batch/PowerShell 2-
L'inconvénient le plus majeur de cette méthode c'est qu'on est à chaque fois obligé de supprimer manuellement nos variables (parfois des dizaines.!!)
Pour contourner ce problème on pourra utiliser une boucle:
Code:
1
2 FOR %%X IN (VAR1 VAR2 VAR3 ..) DO SET %%X=
- Nouvelle méthode
On va utiliser le paire SETLOCAL/ENDLOCAL pour activer un environnement local à notre fichier de commandes
Résultat:Code:
1
2
3
4
5
6
7
8
9 SETLOCAL SET VAR1=SITE: SET VAR2=Developpez.net SET VAR3=FORUM: SET VAR4=Script Batch/PowerShell ECHO 1- %VAR1% %VAR2% %VAR3% %VAR4% ENDLOCAL ECHO 2- %VAR1% %VAR2% %VAR3% %VAR4%
Code:
1
2
3
4
5 1- SITE: Developpez.net FORUM: Script Batch/PowerShell 2-
- Forcer la lecture des variables
Prenons l'exemple d'un fichier "test.txt" contenant :
On veux étendre les variables d'environnement à leurs valeurs.Code:
1
2
3 %SystemRoot% %UserProfile%\Bureau C:\walid2
Si on fait ceci:
La sortie ne sera pas correcte.Code:
1
2 for /f "delims=" %%a in (test.txt) do echo.%%a
On doit FORCER la lecture des variables par le biais de "CALL" :
Code:
1
2
3 for /f "delims=" %%a in (test.txt) do call echo %%a for /f "delims=" %%a in (test.txt) do call dir "%%a" for /f "delims=" %%a in (test.txt) do call copy "%%a" .\MyRep
- Référencer une variable "textuellement"
- Désactiver l'ERV (par défaut)
ou bien:Code:
1
2
3
4
5 SETLOCAL ENABLEEXTENSIONS DISABLEDELAYEDEXPANSION SET DIRCMD=/B/A-D SET Z=%SystemRoot% SET X=Z CALL DIR %%%X%%%
- Activer l'ERV
Code:
1
2
3
4
5 SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION SET DIRCMD=/B/A-D SET Z=%SystemRoot% SET X=Z DIR !%X%!
- Activer/Désactiver l'ERV (cause et conséquence)
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 SETLOCAL SET +=BONJOUR ! ( SET +=HELLO ! ECHO %+% ) ENDLOCAL SETLOCAL ENABLEDELAYEDEXPANSION SET #=BONJOUR ! ( SET #=HELLO ! ECHO !#! ) ENDLOCAL SETLOCAL DISABLEDELAYEDEXPANSION SET \=BONJOUR ! ( SET \=HELLO ! CALL ECHO %%\%% ) ENDLOCAL
- Substitution/Suppression de valeur
Il est possible de substituer/modifier/supprimer/ajouter des chaînes de
caractères dans la valeur de la variable, Il existe 3 "mode opérationnels" :
- Mode 1 (normal)
dans ce mode on procède pas à pas :
voici un autre exemple:Code:
1
2
3
4
5
6
7 SET _VAR=tidnis SET _VAR SET _VAR=%_VAR:t=T% SET _VAR=%_VAR:i=% % Suppression % SET _VAR=%_VAR:d=u% % Substitution % SET _VAR=%_VAR:s=isie% % Adjonction % SET _VAR
Code:
1
2
3 SET _VAR=0x1x2x3x4x5x6x7x8x9x SET _VAL=%_VAR:x= % SET _
- Mode 2 (automatisé)
On regroupe tous les remplacements dans une boucle :
Code:
1
2
3
4
5
6 SETLOCAL ENABLEDELAYEDEXPANSION SET _VAR=test: (1.x.2.x.3.x.4.x.5.x.6.x.7.x.8.x.9) SET _VAR FOR %%: IN ("(=[",")=]",".= ",":= =>","test=TEST","x=") DO SET "_VAR=!_VAR:%%~:!" SET _VAR ENDLOCAL
- Mode 3
Ce mode est une extension peu connue du "MODE NORMAL".
Prenons un exemple qui nous permettra de voir son fonctionnement et son utilité :
Autre exemple :Code:
1
2
3 SET _VAR=VALUE VALEUR SET _VAR=%_VAR:* =% SET _VAR
L'astérisque * match tous les caractères avant le(s) caractère(s) qui le succèdent.Code:
1
2
3
4 SET _VAR=abcdefghijklmnopqrstuvwxyz0123456789 SET _VAR SET _VAR=%_VAR:*z=VALEURS NUMERIQUES: % SET _VAR
- Extraction de valeurs
La syntaxe est connue (SET /?), mais voici un petit exemple :
Code:
1
2
3
4 SET $VAR=[DATA1]xxxx[DATA2]xxxx[DATA3] SET $VAR SET $VAR={%$VAR:~-6,+5%}....{%$VAR:~12,+5%}....{%$VAR:~1,+5%} SET $VAR
- Modification des variables globales dans un environement local
Dans un environnement local, lorsque l'on modifie les variables globales, les nouvelles valeurs ne remplacement pas les anciennes.
Cet exemple montre les modifications "normales" que doivent respecter les variables "_VAR" et "_VAL"
Retournera :Code:
1
2
3
4
5
6
7
8 SET _VAR=VALEUR 1 SET _VAL=VALEUR 2 SET _ & CALL:IsFunc & SET _ EXIT /B :IsFunc SET _VAR=VALEUR 3 SET _VAL=VALEUR 4 GOTO:EOF
Ici on constate que lorsqu'on déclare nos 2 variables dans un environnement local "dans la sous-fonction" les valeurs dans l'environnement "global" prennent le dessus sur les valeurs dans l'environnement "local".Code:
1
2
3
4 _VAL=VALEUR 2 _VAR=VALEUR 1 _VAL=VALEUR 4 _VAR=VALEUR 3
Retournera :Code:
1
2
3
4
5
6
7
8
9
10
11 SET _VAR=VALEUR 1 SET _VAL=VALEUR 2 CALL:IsFunc & SET _ EXIT /B :IsFunc SETLOCAL SET _ SET _VAR=VALEUR 3 SET _VAL=VALEUR 4 ENDLOCAL GOTO:EOF
Code:
1
2
3
4 _VAL=VALEUR 2 _VAR=VALEUR 1 _VAL=VALEUR 2 _VAR=VALEUR 1
Pour contourner ce problème on doit apporter nos modifications en dehors de l'environnement local :
Retournera :Code:
1
2
3
4
5
6
7
8
9
10
11
12 SET _VAR=VALEUR 1 SET _VAL=VALEUR 2 CALL:IsFunc & SET _ EXIT /B :IsFunc SETLOCAL SET _ ENDLOCAL&( SET _VAR=VALEUR 3 SET _VAL=VALEUR 4 ) GOTO:EOF
Code:
1
2
3
4 _VAL=VALEUR 2 _VAR=VALEUR 1 _VAL=VALEUR 4 _VAR=VALEUR 3
- Portée des variables
- structure linéaire:
dans le cas d'une structure SETLOCAL/ENDLOCAL linéaire, l'utilisation des variables localement n'est correcte que lorsque le traitement sur ces variables est dans ce même environnement.
Code:
1
2
3
4
5
6
7
8
9
10 @ECHO OFF SETLOCAL SET $VAR=HELLO IF DEFINED $VAR (ECHO $VAR DEFINIE) ELSE (ECHO $VAR NON DEFINIE) ENDLOCAL SETLOCAL IF DEFINED $VAR (ECHO $VAR DEFINIE) ELSE (ECHO $VAR NON DEFINIE) ENDLOCAL PAUSE
- structure imbriquée:
Chaque environnement local crée hérite des variables local de l'environnement parent (l'imbrication est limitée à 32 niveau )
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 @ECHO OFF SETLOCAL SET A=SALAM SETLOCAL SET B=BONJOUR SETLOCAL SET C=HELLO ECHO ENV.LOCAL 3: %A% %B% %C% ENDLOCAL ECHO ENV.LOCAL 2: %A% %B% %C% ENDLOCAL ECHO ENV.LOCAL 1: %A% %B% %C% ENDLOCAL PAUSE
- Variables dynamiques
Je ne vais pas répéter l'aide de la commande SET /?
%CD%, %TIME%, %DATE%, etc. sont toutes
des variables dynamiques qui changent selon le contexte.
Les deux scripts ci dessous, montrent comment utiliser les variables dynamiques %ERRORLEVEL% et %RANDOM%.
But : tester l'existence du fichier mis en paramètre avec les ERRORLEVEL's
Errorlevel.bat
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 @ECHO OFF SETLOCAL ENABLEEXTENSIONS IF "%~1"=="" ( Call:ExitCode 1) ELSE IF NOT EXIST "%~1" ( Call:ExitCode 2) ELSE ( Call:ExitCode 0) IF %ERRORLEVEL%==2 (ECHO {%~1} N'EXISTE PAS) IF %ERRORLEVEL%==1 (ECHO PARAMETRE MANQUANT) IF %ERRORLEVEL%==0 (ECHO LE FICHIER {%~1} EST PRESENT..) ENDLOCAL & GOTO:EOF :ExitCode EXIT /B %1 GOTO:EOF
But : créer l'expression d'un intervalle entre 2 nombres pour un nombre aléatoire
Random.bat
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 @ECHO OFF & SETLOCAL ENABLEEXTENSIONS & SET/AMAX=%2,MIN=%1 IF NOT DEFINED MAX IF NOT DEFINED MIN (GOTO:HELP) IF %MAX% LSS %MIN% (GOTO:HELP) SET/A_MAX=(MAX-MIN)+1,_EXP=%RANDOM%%%_MAX+MIN ECHO. ECHO MIN=%min% ECHO MAX=%max% ECHO EXP=%%RANDOM%%%%%%%_MAX%+%MIN% ECHO RAN=%_EXP% ENDLOCAL & EXIT /B :HELP ::::::::::::::::::::::::::::::::::::::::::::::::: CLS ECHO. ECHO. ECHO USAGE: RANDOM min max ECHO RANDOM ECHO. ECHO EXEMPLE: RANDOM 142 284 ECHO. ECHO MIN = 142 ^<- Minimum ECHO MAX = 284 ^<- Maximum ECHO EXP = %%RANDOM%%%%%%143+142 ^<- Expression ECHO RAN = 164 ^<- Nombre Aleatoire ECHO. ECHO INFOS: 1- il faut que MIN =^< MAX ECHO 2- Intervale limiter de: 0 … 32767 ECHO. goto:EOF :::::::::::::::::::::::::::::::::::::::::::::::::::::::
- Variables spéciales
Ces variables provoquent un changement dans le comportement de quelques commandes.
Cas de COPYCMD:
Code:
1
2
3
4 SET COPYCMD=/B COPY FILE1+FILE2+FILE3 FILE4 REM # COPY /B FILE1+FILE2+FILE3 FILE4
Cas de DIRCMD:
Code:
1
2
3 SET DIRCMD=/B/A-D/S DIR MyFolder REM # DIR /B/A-D/S
- Appel de variables externes
On peux appeler des variables externes dans nos fichiers de commandes.
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 SETLOCAL & SET $T=%TIME% ECHO>TM.BAT SET $T FOR %%: in (CALL DEL) do %%: TM.BAT ::::::::::::::::::::::::::::::::::::::::::::::::::: ::ICI LE TRAITEMENT:EXEMPLE: DIR /B /A-D /S %WINDIR%\*.EXE CLS ::::::::::::::::::::::::::::::::::::::::::::::::::: ECHO DEBUT: %$T% ECHO FIN : %TIME% ENDLOCAL
- Les caractères réservés
Prenons cette exemple:
Code:
1
2
3
4
5 SET _VAR=^^ ^& %% ^| ^< ^> REM SET _VAR retourne le bon résultat SET _VAR REM ECHO %_VAR% retourne une erreur ECHO %_VAR%
On constate que les doubles-quotes ont leur importance dans l'interprétation des caractères réservés.Code:
1
2
3
4
5 SET "_VAR=^^ ^& %% ^| ^< ^>" REM SET _VAR retourne un résultat erroné SET _VAR REM ECHO %_VAR% retourne le bon résultat ECHO %_VAR%
- Création de Pseudo-Arrays
L'appel de ces variables ce fait par:Code:
1
2
3
4
5
6
7 SETLOCAL ENABLEDELAYEDEXPANSION SET/AX=0 & FOR %%X IN (STR1 STR2 STR3 STR4) DO ( SET ARRAY[!X!]=%%X SET/AX+=1 ) SET ARRAY[ ENDLOCAL
Code:SET ARRAY[0] SET ARRAY[1]...SET ARRAY[n]
- Héritage de l'instance de Cmd.exe avec son application Cmd.exe parente
En imbriquant des instances de Cmd.exe, vous pouvez apporter des modifications à l'environnement local sans affecter l'application parente de Cmd.exe.
Pour appeler une nouvelle instance de cmd.exe tapez cmd
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 c:\RepTest-> SET VAR=BONJOUR MAITRE c:\RepTest-> ECHO %VAR% BONJOUR MAITRE c:\RepTest-> CMD Microsoft Windows XP [version 5.1.2600] (C) Copyright 1985-2001 Microsoft Corp. c:\RepTest-> ECHO %VAR% BONJOUR MAITRE c:\RepTest-> SET VAR=ADIEU MAITRE c:\RepTest-> ECHO %VAR% ADIEU MAITRE c:\RepTest-> EXIT c:\RepTest-> ECHO %VAR% BONJOUR MAITRE
- Variable d'env. utilisateur/système
- Quelques variables d'env. utilisateur :
Code:
1
2
3
4
5
6
7
8
9 %ALLUSRERPROFILE% %APPDATA% %CD% %CMDCMDLINE% %LOGONSERVER% %PROMPT% %USERDOMAIN% %USERNAME% %USERPROFILE%
- Quelques variables d'env. système :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 %CMDEXTVERSION% %COMPUTERNAME% %COMSPEC% %DATE% %ERRORLEVEL% %HOMDRIVE% %HOMEPATH% %HOMESHARE% %NUMBER_OF_PROCESSORS% %OS% %PATH% %PATHEXT% %PROCESSOR_ARCHITECTURE% %PROCESSOR_IDENTIFIER% %PROCESSOR_LEVEL% %PROCESSOR_REVISION% %RANDOM% %SYSTEMDRIVE% %SYSTEMROOT% %TEMP% %TIME% %WINDIR%
- Créer des variables dynamiquement:
En activant l'ERV on peux exploiter les variables dynamiquement.
- Expansion au contenu de la variable
va Afficher la valeur de la variable "VAR"Code:
1
2
3
4
5
6 SETLOCAL ENABLEDELAYEDEXPANSION SET VAR=VAL ECHO !VAR%VAL%! ENDLOCAL
- Expansion au contenu de la variable
Expansion au contenu d'autres variables
va Afficher les valeurs des variable "VARVAL" et "VALVAR"Code:
1
2
3
4
5
6
7
8
9
10
11
12 SETLOCAL ENABLEDELAYEDEXPANSION SET VARVAL=VARVAL SET VALVAR=VALVAR SET VAR=VAL ECHO !VAR%VAR%! SET VAR=VAL ECHO !%VAR%VAR! ENDLOCAL
les 2 variables "VAR" de cet exemple on été dynamiquement
étendu en respectivement "VARVAL" et "VALVAR"
autre exemple:
Code:
1
2
3
4
5
6
7 SETLOCAL ENABLEDELAYEDEXPANSION SET VALEUR=5 SET VAR5=VALEUR 5 SET VAR=VALEUR ECHO !VAR%VALEUR%! ENDLOCAL
@ suivre..