les parenthèses dans le scripting de commandes NT
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
1 2 3 4
| C:> a.bat
true else echo false
true |
@suivre