IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scripts/Batch Discussion :

les parenthèses dans le scripting de commandes NT


Sujet :

Scripts/Batch

  1. #1
    Membre chevronné
    Avatar de I'm_HERE
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 013
    Points : 1 991
    Points
    1 991
    Par défaut 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 : 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

  2. #2
    Membre expert
    Avatar de sachadee
    Homme Profil pro
    AMI DU BAT
    Inscrit en
    Janvier 2013
    Messages
    1 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Brésil

    Informations professionnelles :
    Activité : AMI DU BAT
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2013
    Messages : 1 478
    Points : 3 768
    Points
    3 768
    Par défaut
    Un grand merci pour ces, excellentes, explications
    ________________________________
    Un p'tit coup de pouce ça fait toujours plaisir, pensez-y !
    ________________________________

Discussions similaires

  1. Réponses: 1
    Dernier message: 05/01/2013, 21h41
  2. [WinCC Flexible 2008] Atteindre les objets dans un script
    Par noahsaga dans le forum Automation
    Réponses: 2
    Dernier message: 17/07/2012, 16h01
  3. Réponses: 5
    Dernier message: 28/09/2008, 21h02
  4. droper les index dans un script ksh
    Par donny dans le forum Oracle
    Réponses: 7
    Dernier message: 26/07/2006, 12h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo