Précédent   Forum du club des développeurs et IT Pro > Systèmes > Windows > Vos contributions
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 17/03/2009, 12h10   #1
I'm_HERE
Membre Expert
 
Avatar de I'm_HERE
 
Homme Walid Toumi
Inscription : juillet 2008
Messages : 891
Détails du profil
Informations personnelles :
Nom : Homme Walid Toumi
Localisation : Tunisie

Informations forums :
Inscription : juillet 2008
Messages : 891
Points : 1 222
Points : 1 222
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 :
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 :
1
2
3
4
5
6
7
   
                       
                            {1}CALL :SFU "Bonjour Maitre"
                            {2}GOTO :EOF
                            {3}
                            {4}:SFU
                            {5}ECHO.%~1

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



Code :
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 :
::-  [CALL :SFU %VAR%] =  [CALL :SFU Bonjour Maitre]
Ce qui se traduit par Bonjour=%1 et Maitre=%2
alors que:

Code :
 ::-  [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 :
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 :
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 :
1
2
3
 
        ::- SET [NEWVAR]=[Bonjour Maitre] [2]
        ::- SET    %1   =     %VAR%            2
-----------------------
D- expansions retardées des variables:
-----------------------


)- expansion activée

Code :
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 :
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 :
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 :
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 :
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 :
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 :
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 :
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 :
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 :
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 :
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 :
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 :
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 :
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 :
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 :
 For /f "tokens=*" %%z In ("une autre expression") Do Echo %%z
Cette boucle equivaut:
Code :
 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 :
1
2
3
4
 {1}For /f "Tokens=*" %%a In ('dir /b /a-d "*.txt" 
                                           "*.bat"
                                           "*.cmd"') Do Echo "%%~a"
Code :
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 :
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 :
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 :
 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 :
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 :
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à..
__________________

Gawk
Sed
ActivePerl
python
CoreUtils for Windows


I'm_HERE est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2009, 14h42   #2
Acris
Membre actif
 
Inscription : juillet 2008
Messages : 239
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 239
Points : 196
Points : 196
Bravo pour ces explications.
Acris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2009, 15h21   #3
Laurent Dardenne
Rédacteur
 
Inscription : janvier 2003
Messages : 6 246
Détails du profil
Informations forums :
Inscription : janvier 2003
Messages : 6 246
Points : 10 192
Points : 10 192
Salut,
je me permet une petite remarque, pour le cas "1- Sans arguments:", je pense que ta formulation peut être précisé
Citation:
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ù
Citation:
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
Citation:
::- [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.
__________________
Tutoriels Delphi Win32/Delphi .NET/Oracle/PowerShell - Ressources PowerShell - FAQ Delphi - FAQ Delphi .NET
Beatus, qui prodest, quibus potest.
Laurent Dardenne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2009, 16h32   #4
I'm_HERE
Membre Expert
 
Avatar de I'm_HERE
 
Homme Walid Toumi
Inscription : juillet 2008
Messages : 891
Détails du profil
Informations personnelles :
Nom : Homme Walid Toumi
Localisation : Tunisie

Informations forums :
Inscription : juillet 2008
Messages : 891
Points : 1 222
Points : 1 222
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 :
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 :
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 :
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
__________________

Gawk
Sed
ActivePerl
python
CoreUtils for Windows


I'm_HERE est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2009, 17h19   #5
Laurent Dardenne
Rédacteur
 
Inscription : janvier 2003
Messages : 6 246
Détails du profil
Informations forums :
Inscription : janvier 2003
Messages : 6 246
Points : 10 192
Points : 10 192
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 .
__________________
Tutoriels Delphi Win32/Delphi .NET/Oracle/PowerShell - Ressources PowerShell - FAQ Delphi - FAQ Delphi .NET
Beatus, qui prodest, quibus potest.
Laurent Dardenne est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 18/03/2009, 14h43   #6
Laurent Dardenne
Rédacteur
 
Inscription : janvier 2003
Messages : 6 246
Détails du profil
Informations forums :
Inscription : janvier 2003
Messages : 6 246
Points : 10 192
Points : 10 192
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 :
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 :
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".
__________________
Tutoriels Delphi Win32/Delphi .NET/Oracle/PowerShell - Ressources PowerShell - FAQ Delphi - FAQ Delphi .NET
Beatus, qui prodest, quibus potest.
Laurent Dardenne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2009, 15h37   #7
I'm_HERE
Membre Expert
 
Avatar de I'm_HERE
 
Homme Walid Toumi
Inscription : juillet 2008
Messages : 891
Détails du profil
Informations personnelles :
Nom : Homme Walid Toumi
Localisation : Tunisie

Informations forums :
Inscription : juillet 2008
Messages : 891
Points : 1 222
Points : 1 222
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 :
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 :
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 :
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 :
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 :
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 :
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
__________________

Gawk
Sed
ActivePerl
python
CoreUtils for Windows


I'm_HERE est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2009, 16h41   #8
Laurent Dardenne
Rédacteur
 
Inscription : janvier 2003
Messages : 6 246
Détails du profil
Informations forums :
Inscription : janvier 2003
Messages : 6 246
Points : 10 192
Points : 10 192
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...
__________________
Tutoriels Delphi Win32/Delphi .NET/Oracle/PowerShell - Ressources PowerShell - FAQ Delphi - FAQ Delphi .NET
Beatus, qui prodest, quibus potest.
Laurent Dardenne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2009, 21h45   #9
maxim_um
Membre émérite
 
Avatar de maxim_um
 
Inscription : mai 2007
Messages : 895
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 895
Points : 806
Points : 806
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.
maxim_um est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 14h49.


 
 
 
 
Partenaires

Hébergement Web