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

Vos contributions Discussion :

[HOWTO] Sous-programmes + boucles [Trucs & Astuces]


Sujet :

Vos contributions

  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 [HOWTO] Sous-programmes + boucles
    salut,

    j'espère que ce HOWTO va aider à comprendre quelques notions fondamentales en batch (les boucles et les sous-programmes)
    j'ai essayé de donner le maximum d'exemples..et le moins de théorie possibles

    il est à noter aussi que je n'ai pas parler des options de la boucles FOR /F "delims - tokens"..ça sera peut être dans un autre HOWTO


    LES SOUS-FONCTIONS

    Types de fonctions:

    ==================================================================
    1- Sans paramètres:
    ==================================================================


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      
                                {1}SET VAR=Bonjour Maitre
                                {2}CALL :SFU 
                                {3}GOTO :EOF
                                {4}
                                {5}:SFU
                                {6}ECHO.%VAR%
    Ligne 5: appel explicite de la fonction SFU
    Ligne 6: début du corps de la fonction SFU, contient l'affichage de la variable %VAR%


    ==================================================================
    2- Avec paramètres:
    ==================================================================


    ----------------------
    A- chaîne de caractères
    ----------------------


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
       
                           
                                {1}CALL :SFU "Bonjour Maitre"
                                {2}GOTO :EOF
                                {3}
                                {4}:SFU
                                {5}ECHO.%~1

    ----------------------
    B- variable
    ----------------------



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
       
                                {1}SET VAR=Bonjour Maitre
                                {2}CALL :SFU "%VAR%"
                                {3}GOTO :EOF
                                {4}
                                {5}:SFU
                                {6}ECHO.%~1
    Ligne 2: la variable %VAR% est déclarer entre guillemets

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ::-  [CALL :SFU %VAR%] =  [CALL :SFU Bonjour Maitre]
    Ce qui se traduit par Bonjour=%1 et Maitre=%2
    alors que:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ::-  [CALL :SFU "%VAR%"] = [CALL :SFU "Bonjour Maitre"]
    ce qui se traduit par "Bonjour Maitre"=%1

    Ligne 6: Il ne reste plus qu'enlever les guillemets

    ::- ECHO.%~1

    On peut aussi utiliser le %* pour appeler les paramètres

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
                                {1}SET VAR=Bonjour Maitre
                                {2}CALL :SFU %VAR%
                                {3}GOTO :EOF
                                {4}
                                {5}:SFU
                                {6}ECHO.%*

    Ligne 6: le signe %* vaut tout le contenu de la variable %VAR%
    %*=Bonjour Maitre

    -----------------------
    C- référence
    -----------------------




    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
                                {1}SET VAR=Bonjour Maitre
                                {2}CALL :SFU NEWVAR
                                {3}ECHO.%NEWVAR%
                                {4}GOTO :EOF
                                {5}
                                {6}:SFU
                                {7}SET %1=%VAR% 2

    Ligne 2: le paramètre NEWVAR sera dans le corps de la fonction transformer en une variable %NEWVAR%
    Ligne 7:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            ::- SET [NEWVAR]=[Bonjour Maitre] [2]
            ::- SET    %1   =     %VAR%            2
    -----------------------
    D- expansions retardées des variables:
    -----------------------


    )- expansion activée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      
                               
                               {1}SETLOCAL ENABLEDELAYEDEXPANSION
                               {2}SET VAR=Bonjour Maitre
                               {3}CALL :SFU VAR
                               {4}GOTO :EOF
                               {5}
                               {6}:SFU
                               {7}ECHO.!%1%!
    Ligne 3: Le nom du paramètre doit être identique au nom
    de la variable ici: VAR et %VAR%

    )- expansion désactivée


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
                               
                               {1}SETLOCAL DISABLEDELAYEDEXPANSION
                               {2}SET VAR=Bonjour Maitre
                               {3}CALL :SFU VAR
                               {4}GOTO :EOF
                               {5}
                               {6}:SFU
                               {7}CALL ECHO.%%%1%%

    Ligne 3: Le nom du paramètre doit être identique au nom
    de la variable ici: VAR et %VAR%


    -----------------------------------
    E- Concaténation de paramètres
    -----------------------------------




    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
                               {1}SET VAR=Bonjour Maitre
                               {2}CALL :SFU "%VAR%" CONCAT
                               {3}ECHO.%CONCAT%
                               {4}GOTO :EOF
                               {5}
                               {6}:SFU
                               {7}SET CONCAT=%~1 2
                               {8}SET "%2=%CONCAT%"

    Voici un autre exemple:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
       
                              {1}SET VAR1=Bonjour
                              {2}Set VAR2=Maitre
                              {3}CALL :SFU VAR1 VAR2 VAR3
                              {4}ECHO.%VAR1% + %VAR2% = %VAR3%
                              {5}GOTO :EOF
                              {6}
                              {7}:SFU
                              {8}CALL SET STR=%%%1%%-%%%2%%
                              {9}CALL SET "%3=%STR%"


    Utilisation de la commande SHIFT:

    on peut utiliser la commande SHIFT pour exploiter un nombre éléver de paramètres:
    Pour illustrer mes propos voici un exemple:
    (Ce code permet de vérifier si les processus mis comme paramètre dans CALL
    sont actifs ou pas)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
         
    {1}@ECHO OFF
    {2}SET Process=CMD NOTEPAD REGEDIT EXPLORER IEXPLORE ALG WRITE VLC SUM FORMAT OSK 
    {3}CALL :PROC %Process%
    {4}GOTO:EOF
    {5}
    {6}:PROC
    {7}TASKLIST -NH|FIND /I "%1" >NUL &&ECHO:  ACTIF %1||ECHO:INACTIF %1
    {8}SHIFT
    {9}IF NOT %1!==! GOTO PROC

    LES BOUCLES FOR

    ====================================================================
    1-Boucle FOR
    ====================================================================


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                  {1}For %%? In ("ceci est un exemple") Do Echo %%?
                  {2}For %%? In (ceci est un exemple) Do Echo %%?
                  {3}For %%? In (ceci est "un exemple") Do Echo %%?

    La boucle 1: va retourner: La boucle 2: va retourner:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      
                                    ceci
                                    est
                                    un
                                    exemple
    il ne sera pas question d'expression mais de mots
    La boucle 3: va retourner:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
                                    ceci
                                    est
                                   "un exemple"
    ==> l'utilisation des guillemets provoque un changement de l'affichage de %%?

    ====================================================================
    2-Boucle FOR /D
    ====================================================================


    On suppose qu'on a un répertoire "folder" ayant comme
    contenu:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
      
                            D:\folder\mon_batch.bat
                            D:\folder\test\log.txt
                            D:\folder\test\index.htm
                            D:\folder\key\files\stf.cmd
                            D:\folder\key\files\Xml_files
                            D:\folder\Logs_2008_11
                            D:\folder\test_1251_10 
                            D:\folder\test_12_2002
                            D:\folder\Logs_2008_03
                            D:\folder\Logs_2
    :=: On va exploiter cette structure du dossier
    :=: tout au long du cours


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
         
                {1}FOR /D %%a In (*) Do Echo %%a
                {2}FOR /D %%a In (test_*_* logs_*_*) Do Echo %%a

    La Boucle 1: va retourner:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
                                   key
                                   test
                                   Logs_2008_11
                                   test_1251_10
                                   test_12_2002
                                   Logs_2008_03
                                   Logs_2
    --> la boucle ne liste pas les sous-dossier.
    -->On peut utiliser à la place de (*) un (*.) ou bien (*.*)

    La Boucle 2: va retourner:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                                   Logs_2008_11
                                   test_1251_10
                                   test_12_2002
                                   Logs_2008_03
    -->On peut chercher une structure spécial pour les noms des dossiers ici :
    test_*_* et logs_*_*


    =====================================================================
    3-Boucle FOR /R
    =====================================================================



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      
                 {1}FOR /R "." %%a In (.) Do Echo %%a
                 {2}FOR /R "." %%a In (*) Do Echo %%a

    La Boucle 1: va retourner:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
                                   D:\folder\.
                                   D:\folder\Test\.
                                   D:\folder\key\.
                                   D:\folder\key\files\.
                                   D:\folder\key\files\Xml_files\.
                                   D:\folder\Logs_2008_11\.
                                   D:\folder\test_1251_10\.
                                   D:\folder\test_12_2002\.
                                   D:\folder\Logs_2008_03\.
                                   D:\folder\Logs_2\.
    -->le repertoire parent du batch "D:\folder\." sera lui aussi listé
    -->les répértoires seulement seront listés (pas les fichiers)


    La Boucle 2: va retourner:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                                   D:\folder\mon_batch.bat
                                   D:\folder\test\log.txt
                                   D:\folder\test\index.htm
                                   D:\folder\key\files\stf.cmd
    --> (*.*) est synonyme de (*)
    --> On peut choisir une/plusieurs extension(s) (*.cmd *.txt)
    --> On peut même lister les répértoires et les fichiers ensembles avec (* .)


    ======================================================================
    4-Boucle FOR /F
    ======================================================================

    La Boucle FOR /F est la plus utiliser, car elle regroupe toutes
    les fonctionnalités des autres boucle et + encore:

    --------------
    a) Expression
    --------------



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     For /f "tokens=*" %%z In ("une autre expression") Do Echo %%z
    Cette boucle equivaut:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     For %%z In ("une autre expression") Do Echo %%z
    La seule difference est que les guillemets dans FOR /F sont omis
    au contraire de la boucle FOR


    ---------------------------
    b) Lister fichiers/dossiers
    --------------------------




    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     {1}For /f "Tokens=*" %%a In ('dir /b /a-d "*.txt" 
                                               "*.bat"
                                               "*.cmd"') Do Echo "%%~a"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    {2}For /f "Tokens=*" %%a In ('dir /b /a-d /S "*.txt"
                                                 "*.bat"
                                                 "*.cmd"') Do Echo "%%~a"

    La Boucle 1: va retourner:
    La Boucle 2: va retourner:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    
                                     "D:\folder\key\files\stf.cmd"
                                     "D:\folder\mon_batch.bat"
                                     "D:\folder\test\log.txt"

    --> avec le commutateur /S :

    + Les fichiers dans les sous-dossiers seront aussi lister
    + les chemins des fichiers seront absolus [D:\folder\mon_batch.bat] au lieu de [mon_batch.bat]


    ----------------------
    c) Contenu des fichiers
    ----------------------



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
          {1}For /f "delims=" %%z In (index.txt help.txt) Do Echo %%a
          {2}For /f "delims=" %%z In (index.txt help.txt 
                            "une autre expression") Do Echo %%z
    La Boucle 1: va afficher le contenu de index.txt + help.txt
    c'est un genre de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     TYPE index.txt help.txt
    La Boucle 2: c'est la même chose que la première sauf que
    l'expression "une autre expression" va aussi être
    afficher

    ======================================================================
    5-Boucle FOR /L
    ======================================================================


    [CODE]

    FOR /L est utiliser parfois à la place des branchements
    GOTO, car elle est plus facile à gérer (mais pas tout le temps !!)

    créer 3 fichier:file1.bat file2.bat file3.bat et executer les 2 codes ci-dessous:

    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
      
      @ECHO OFF
      Setlocal Enableextensions
      ::nombre de fichiers à traiter
      Set nb_limit=3
      Set /a loop=0
    
      :boucle
      Set /a loop+=1
      Start "window %loop%" file%loop%.bat
      If %loop% EQU %nb_limit% goto end
      goto boucle
    
      :end
      Endlocal

    à la place de ceci on peut facilement faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      @ECHO OFF 
     ::nombre de fichiers à traiter
      FOR /L %%a In (1,1,3) do (
      Start "window %%a" file%%a.bat)
      EXIT
    voilà,...il reste beaucoup de choses qui n'ont pas été citées ici...mais..l'essentiel et là..

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2008
    Messages : 240
    Points : 247
    Points
    247
    Par défaut
    Bravo pour ces explications.

  3. #3
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Salut,
    je me permet une petite remarque, pour le cas "1- Sans arguments:", je pense que ta formulation peut être précisé
    Ligne 5: appel explicite de la fonction SFU
    Ligne 6: début du corps de la fonction SFU, contient l'affichage de la variable %VAR%
    et peut être ajouter une ligne 7 :
    d'où
    Ligne 7: fin du corps de la fonction SFU (par défaut la fin du fichier .cmd)
    dans Echo.%VAR%, la présence du point n'est pas justifié, est-elle nécessaire ?
    Pour ceci
    ::- [CALL :SFU %VAR%] = [CALL :SFU Bonjour Maitre]
    Je ne comprend pas ? c'est du pseudo code ?
    Pour "Ce qui se traduit par Bonjour=%1 et Maitre=%2" je pense qu'il reste encore à 'dérouler', qu'est-ce qu'ici Bonjour et %1.
    Comme tu parles de "quelques notions fondamentales ", un petit chapitre sur l'usage des variables et paramètres ne serait pas superflu.
    Tu peux aussi reprendre quelque éléments de la doc de MS si tu la cites ce n'est pas gênant.
    Citation Envoyé par I'm_HERE
    "voilà,...il reste beaucoup de choses qui n'ont pas été citées ici...mais..l'essentiel est là.."
    Tu m'étonnes ! Mine de rien "y à gratter" sur le sujet ;-)
    Le mieux aurait été de le proposer sous forme de tutoriel, il en existe très peu en français sur le sujet, voir dans la FAQ.

    Belle initiative, châpeau bas !

    ps
    Je me permettrais de revenir te proposer d'autre remarques , là je n'ai pas trop le temps.

  4. #4
    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
    Salut,

    Citation Envoyé par Laurent Dardenne Voir le message
    Salut,
    je me permet une petite remarque, pour le cas "1- Sans arguments:", je pense que ta formulation peut être précisé
    c'est fait, merci
    Citation Envoyé par Laurent Dardenne Voir le message
    et peut être ajouter une ligne 7 :
    ce n'est pas nécessaire puisqu'il n'y a pas succession de codes

    Citation Envoyé par Laurent Dardenne Voir le message
    dans Echo.%VAR%, la présé,ence du point n'est pas justifi est-elle nécessaire ?
    La présence du point est généralement nécessaire quand on a une variable à afficher:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
                 SET VAR=
                 :- Commande ECHO désactivée
                 ECHO %VAR%
                 
                 SET VAR=
                 :- Rien ne sera affiché
                 ECHO.%VAR%
    Citation Envoyé par Laurent Dardenne Voir le message
    Je ne comprend pas ? c'est du pseudo code ?
    Pour "Ce qui se traduit par Bonjour=%1 et Maitre=%2" je pense qu'il reste encore à 'dérouler', qu'est-ce qu'ici Bonjour et %1.
    non,non, c'était juste pour shématiser le processus,
    je parlais de ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SET VAR=Bonjour Maitre
    CALL :SFU %VAR%
    GOTO :EOF
    
    :SFU
    ::- je parlais de ceci
    ECHO.%%1 = %1
    ECHO.%%2 = %2
    :- et de ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SET VAR=Bonjour Maitre
    CALL :SFU "%VAR%"
    GOTO :EOF
    
    :SFU
    ECHO.%%1 = %1
    ECHO.%%2 = %2
    ==> l'interprétation des guillemets

  5. #5
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par I'm_HERE
    ce n'est pas nécessaire puisqu'il n'y a pas succession de codes
    J'ai bien compris, ça nous le savons mais tu ne l'indiques pas.
    C'est pour moi une évidence qu'il est bon de préciser, d'où ma remarque.
    Citation Envoyé par I'm_HERE
    La présence du point est généralement nécessaire quand on a une variable à afficher:
    Disons qu'ici il y a une petite astuce implicite, si la variable ne contient rien le point empêche effectivement un affichage parasite.
    En même temps, son absence t'indiquera que quelque chose ne se passe pas comme prévu. C'est un choix. Et pour le faire il faut connaître les 2 modes de fonctionnement, avec ou sans le point.
    Citation Envoyé par I'm_HERE
    non,non, c'était juste pour schématiser le processus,
    Je sais, je force le trait ;-)
    Il manque en quelque sorte la nomenclature du schémas utilisé, si tu la communiques, ma remarque est nulle et non avenue.
    Lorsque je lis ce type de texte, j'essai de prendre le rôle du candide. Certains points sont dans l'implicite, je comprend ce que tu veux dire parce que je connais le sujet, le public ciblé pas forcément.

    A mon avis tu peux améliorer ce texte sans pour autant tout expliciter, le lecteur a aussi sa part de travail, heureusement d'ailleurs .

  6. #6
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Voici d'autres remarques :
    A- Argument: variable
    Citation Envoyé par I'm_HERE
    Ligne 6: le signe %* vaut tout le contenu de la variable %VAR%
    n'est-ce pas plutot :
    le signe %* référence le contenu de tous les paramètres déclarés lors de l'appel de la sous-fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SET VAR=Bonjour Maitre
    SET VAR2=Second
    CALL :SFU %VAR% %VAR2%
    GOTO :EOF
    :SFU
    ECHO.%*
    ECHO.%* est donc égal à ECHO.%1 %2 %3 %4 %5 %6 %7 %8 %9

    B- Argument: référence
    Citation Envoyé par I'm_HERE
    Ligne 2: comporte une référence NEWVAR qui sera par la suite transtyper en une variable %NEWVAR%
    L'usage du mot transtyper n'est pas adapté au batch, dans ton exemple c'est une concaténation du contenu de la variable %VAR% avec un "2".
    De plus dans l'exemple on passe en argument le nom de la variable que l'on crée dans la sous-fonction. On est dans du code dynamique.
    Enfin tu utilises le terme référence, donc si je comprend bien de pointeur, mais il n'est valable QUE dans le contexte de l'expansion de variable.
    Avec ce mécanisme le contenu de ma variable contient le nom d'une autre variable. Dans l'exemple suivant Pointeur contient une référence SI l'expansion de variable est activée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    @echo off
    set NomDeVariable=Data
    set Data=Donnees de la variable DATA
    set Pointeur=!%NomDeVariable%!
    Echo NomDeVariable = %NomDeVariable%
    Echo Data = %Data%
    Echo Pointeur =%Pointeur%
    Setlocal enabledelayedexpansion
    Echo.
    Echo  *** Activation de l'expansion ***
    Echo.
    Echo Pointeur =%Pointeur%
    Tu ne peux donc pas utiliser le terme de référence dans le premier exemple. Et dans le second il faut utiliser les points d'exclamation pour le préciser.
    je te propose :
    Ligne 2: comporte un nom de variable, NEWVAR. Celui-ci est utilisé pour créer dynamiquement une variable de même nom. Elle contiendra la concaténation du contenu de la variable %VAR% et de la chaîne de caractère " 2".

  7. #7
    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
    Salut et merci pour vos remarques,


    Citation Envoyé par Laurent Dardenne Voir le message
    Voici d'autres remarques :
    A- Argument: variable

    n'est-ce pas plutot :
    le signe %* référence le contenu de tous les paramètres déclarés lors de l'appel de la sous-fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SET VAR=Bonjour Maitre
    SET VAR2=Second
    CALL :SFU %VAR% %VAR2%
    GOTO :EOF
    :SFU
    ECHO.%*
    ECHO.%* est donc égal à ECHO.%1 %2 %3 %4 %5 %6 %7 %8 %9


    oui c'est exact,

    dans l'exemple que j'ai cité

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
       {1}SET VAR=Bonjour Maitre
                                {2}CALL :SFU %VAR%
                                {3}GOTO :EOF
                                {4}
                                {5}:SFU
                                {6}ECHO.%*
    j'essayer de donner "le synonyme" de:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     {1}SET VAR=Bonjour Maitre
                                {2}CALL :SFU "%VAR%"
                                {3}GOTO :EOF
                                {4}
                                {5}:SFU
                                {6}ECHO.%~1
    c-à-d: comment contourner le problème des espaces dans des expressions tel que "Bonjour Maitre"
    quand ils sont utilisés comme paramètres, 2 possbilités: ou bien utiliser un %* ou bien encadré la varaible %VAR% par des guillemets..

    dans l'exemple que vous avez donné:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SET VAR=Bonjour Maitre
    SET VAR2=Second
    CALL :SFU %VAR% %VAR2%
    GOTO :EOF
    :SFU
    ECHO.%*
    vous traiter une autre chose que je n'ai pas eu le temps de la citer c'est: "le regroupement d'un nombre important de paramètres dans une fonction"...et non pas "le problème" d'espacement qui va générer une "décomposition" du paramètre %1 en %1 %2 %3 ...

    j'ai encadré le terme "problème" par des guillemets parceque parfois ça devient une Solution à d'autres problémes, concernant l'extraction de caractères dans des chaînes

    Citation Envoyé par Laurent Dardenne Voir le message

    B- Argument: référence

    L'usage du mot transtyper n'est pas adapté au batch, dans ton exemple c'est une concaténation du contenu de la variable %VAR% avec un "2".
    De plus dans l'exemple on passe en argument le nom de la variable que l'on crée dans la sous-fonction. On est dans du code dynamique.
    je suis d'accord avec vous, mais c'est plutôt un problème de langue, hélàs le français et moi...nous sommes pas amis

    Citation Envoyé par Laurent Dardenne Voir le message
    Dans l'exemple suivant Pointeur contient une référence SI l'expansion de variable est activée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    @echo off
    set NomDeVariable=Data
    set Data=Donnees de la variable DATA
    set Pointeur=!%NomDeVariable%!
    Echo NomDeVariable = %NomDeVariable%
    Echo Data = %Data%
    Echo Pointeur =%Pointeur%
    Setlocal enabledelayedexpansion
    Echo.
    Echo  *** Activation de l'expansion ***
    Echo.
    Echo Pointeur =%Pointeur%
    Tu ne peux donc pas utiliser le terme de référence dans le premier exemple. Et dans le second il faut utiliser les points d'exclamation pour le préciser.
    pas tout à fait:

    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
    @echo off
    set NomDeVariable=Data
    set Data=Donnees de la variable DATA
    Call set Pointeur=%%%NomDeVariable%%%
    
    Echo NomDeVariable = %NomDeVariable%
    Echo Data = %Data%
    
    Setlocal enabledelayedexpansion
    Echo.
    Echo  *** Activation de l'expansion ***
    Echo.
    Echo Pointeur =%Pointeur%
    endlocal
    
    setlocal disabledelayedexpansion
    Echo.
    Echo  *** desactivation de l'expansion ***
    Echo.
    CALL Echo Pointeur =%%Pointeur%%
    endlocal
    
    PAUSE

  8. #8
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par I'm_HERE
    j'essayer de donner "le synonyme" de:
    Je comprends mieux quand tu précises ton intention.
    Citation Envoyé par I'm_HERE
    vous traiter une autre chose que je n'ai pas eu le temps de la citer c'est: "le regroupement d'un nombre important de paramètres dans une fonction"...et non pas "le problème" d'espacement qui va générer une "décomposition" du paramètre %1 en %1 %2 %3 ...
    Je vais donc plus vite que la musique
    Citation Envoyé par I'm_HERE
    hélàs le français et moi...nous sommes pas amis
    Je comprends.
    Citation Envoyé par I'm_HERE
    pas tout à fait:
    tu veux dire que tu n'es pas d'accord sur le point suivant ?
    Citation Envoyé par laurent Dardenne
    Tu ne peux donc pas utiliser le terme de référence dans le premier exemple. Et dans le second il faut utiliser les points d'exclamation pour le préciser.
    Certes, je ne connaissais pas l'usage du call sur l'instruction Set, belle astuce au demeurant. Mais ici tu utilises un autre mécanisme, pour moi cela ne change pas le fond :
    Citation Envoyé par laurent Dardenne
    Enfin tu utilises le terme référence, donc si je comprend bien de pointeur, mais il n'est valable QUE dans le contexte de l'expansion de variable.
    Je dois donc ajouter à ma remarque :
    Citation Envoyé par laurent Dardenne
    ... dans le contexte de l'expansion de variable ou d'un autre mécanisme de substitution.
    Je suis en train de rédiger un tutoriel sur la notion d'objet sous PowerShell, à destination de personne ne connaissant pas la POO, et je te l'accorde ce mot de référence n'est pas si évident à décrire simplement, encore moins les concepts liés.
    Donc ma démarche se voulait préciser l'usage du terme afin d'éviter une possible confusion. Pour moi, en batch son usage est contextuel.

    Tu me diras je coupes peut être les cheveux en quatre...

  9. #9
    Membre éprouvé
    Avatar de maxim_um
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    895
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 895
    Points : 1 018
    Points
    1 018
    Par défaut
    Citation Envoyé par I'm_HERE Voir le message
    j'ai essayé de donner le maximum
    En parle de moi là? Eh! C'est pas comme ça que s'écrit mon pseudo ()

    Citation Envoyé par Laurent Dardenne Voir le message
    Tu me diras je coupes peut être les cheveux en quatre...
    Oui.

    Blague à part, il y a bien deux types de passages de paramètre, par valeur ou par référence (en se référent à..., on parle aussi de la variable comme étant, dans ce contexte, un référent, a fortiori ça permet de cibler un contenu ou d'identifier un conteneur suivant ce qu'on en fait). Que ce soit une valeur ou une référence, il faut savoir qu'il n'y a rien de fondamental là-dedans, il faut voir cela comme un concept ou mieux, une règle d'usage. Le but se résumant à la simple manipulation d'un nom de variable, l'expansion retardée n'y a pas sa place. De même, parler de pointeur est un pas que je ne franchirai pas.

    Maintenant, en ce qui concerne le "Howto" de I'm_HERE. C'est sûr, il y a beaucoup de chose à dire. Mais le but n'était pas d'écrire un livre détaillé et encore moins agrémenté d'un recueil d'astuces, mais seulement un ensemble de recettes. Je trouve que l'effort fourni par I'm_HERE est très louable. Et j'en sais quelque chose, vu le nombre de tours qu'a dû faire ma molette pour parcourir son premier poste, pour cela, I'm_HERE, je t'en félicite.

    Pour conclure, Laurent Dardenne, il y a bien au moins deux points sur lesquels je te rejoins. En effet, cette présentation n'est pas des plus abordable, mais peut être que les débutants ne sont pas concernés, dans quel cas il faudrait un minimum de notions. Peut-être que I'm_HERE pourrait nous en dire plus sur le public visé. Et enfin le deuxième point, c'est que sa place, une foi revue, est sans nul doute dans un tutoriel.

    Bonne continuation à tous.

Discussions similaires

  1. sous programme et parametre
    Par Krispy dans le forum Langage
    Réponses: 2
    Dernier message: 10/04/2006, 17h55
  2. Envoi d'informations dans un sous programme
    Par Tanguy Sarela dans le forum Linux
    Réponses: 3
    Dernier message: 22/12/2005, 16h57
  3. Réponses: 31
    Dernier message: 30/08/2005, 13h10
  4. Réponses: 2
    Dernier message: 04/06/2004, 10h36
  5. [langage] les sous programmes
    Par giverny dans le forum Langage
    Réponses: 6
    Dernier message: 21/07/2003, 19h24

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