salut,


les parenthèses sont des caractères spéciaux dans le scripting de commandes NT, voici quelques rôles et utilisations des parenthèses:


1) ordre des opérations:

Les parenthèses servent à changer l’ordre des opérations mathématiques:


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
C:> set /a 2 + (5 * 5)
27
C:> set /a (2 + 5) * 5
35

2) les parenthèses et la portée de variables:


chaque bloc mis entre parenthèse est traiter par le parseur comme une seule unité, dans un scriptblock les variables sont évalué dans le parsetime et non pas dans le runtime, c'est pour cette raison qu'on doit retarder l'évaluation des variables, voici un petit exemple:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
31
32
C:> type a.bat

@echo off
setlocal DisableDelayedExpansion

Set Global=1
(
  Set Global=2
  echo %Global%
  (
    Set Global=3
    echo %Global%
  )
)
echo %Global%

echo(

setlocal EnableDelayedExpansion

Set Global=1
(
  Set Global=2
  echo !Global!
  (
    Set Global=3
    echo !Global!
  )
)
echo %Global%

pause
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
C:> a.bat

1
1
3

2
3
3

3) dans la boucle forindo

dans une boucle forindo une autre instance de CMD.EXE est executer entre les parenthèses, ce sous-shell est executer dans la portée enfant

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
C:> type .\a.bat

@echo off

tasklist /fi "imagename eq cmd.exe" 
echo(
echo(--- Boucle forindo
for /f "delims=" %%a in ('tasklist /fi "imagename eq cmd.exe" /nh') do echo %%a
echo(----------------
tasklist /fi "imagename eq cmd.exe" /nh
pause

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
C:> a.bat


Nom de l'image              PID* Nom de la session 
========================= ====== =================
cmd.exe                     3408 Console                

--- Boucle forindo
cmd.exe                     3408 Console                
cmd.exe                     3436 Console                
----------------

cmd.exe                     3408 Console



4) alternative au caractère '.' :

avec la commande interne ECHO, l'utilisation de la parenthèse ouvrante est plus robuste que l'utilisation du caractère standard point '.'

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
C:> a.bat

@echo off
setlocal enabledelayedexpansion

set ch=abcdef

echo.!ch:~0,3!
echo(!ch:~0,3!

pause
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
C:> a.bat

ch:~0,3
abc
5) Performance:

le groupement des commandes par des parenthèses peux rendre l'execution des code plus rapide, surtout avec les boucle forindo:
on va tester deux fichiers de commandes a.bat et b.bat et on va calculer le temps d'execution de chaqu'un d'eux par le cmdlet powershell measure-command:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
PS II> type ./a.bat

>_out._  (
  for /l %%a in (1 1 1000) do @echo(%%a
)
del _out._

PS II> type ./b.bat

for /l %%a in (1 1 1000) do @echo(%%a >>_out._ 
del _out._
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
31
PS II> # execution de b.bat
PS II> Measure-Command -Expression { .\b.bat }


Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 0
Milliseconds      : 557
Ticks             : 5575177
TotalDays         : 6,45275115740741E-06
TotalHours        : 0,000154866027777778
TotalMinutes      : 0,00929196166666667
TotalSeconds      : 0,5575177
TotalMilliseconds : 557,5177


PS II> # execution de a.bat
PS II> Measure-Command -Expression { .\a.bat }


Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 0
Milliseconds      : 51
Ticks             : 517157
TotalDays         : 5,98561342592593E-07
TotalHours        : 1,43654722222222E-05
TotalMinutes      : 0,000861928333333333
TotalSeconds      : 0,0517157


6) execution en bloc avant de passer par le pipeline:

parfois on a besoin d'executer un bloc de code comme une seul unité avant de passer par le pipline, pour cette raison on va utiliser les parenthèses, voici un exemple:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
C:> type a.bat

@echo off

for %%a in (5 9 2 6) do @echo %%a | sort
echo(---
(for %%a in (5 9 2 6) do @echo %%a) | sort

pause
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
C:> a.bat

5
9
2
6
---
2
5
6
9

la première boucle forindo passe chaque chaine après l'autre dans le pipeline, la commande SORT.EXE essaye alors de trier chaque chaine à part.
la deuxième boucle forindo est mise entre parenthèse, toute l'expression entre les deux parenthèses
sera alors executer avant de passer par le pipeline à la commande SORT, la commande SORT à maintenant une "collection" à trier


7- sécuriser l'initialisation de variables

si on veux vider une variable pour une utilisation ulterieur et on veux supprimer tous les espaces non désirés, on peux utiliser des guillemets
set "var=" mais on peux aussi utiliser des parenthèses (set var=)



8) dans une structure if/else

sans les parenthèses le parseur ne peux pas séparer les deux instruction if/else

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
C:> type a.bat

@echo off

set var=hello
if %var%==hello echo true else echo false

set var=hello
if %var%==hello (echo true) else echo false

pause
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
C:> a.bat

true else echo false
true
@suivre