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! pause5) Performance:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 C:> a.bat ch:~0,3 abc
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@suivre
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 C:> a.bat true else echo false true
Partager