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 :

Modifier une variable dans un même batch


Sujet :

Scripts/Batch

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 35
    Points : 29
    Points
    29
    Par défaut Modifier une variable dans un même batch
    Salut à tous!
    Je bloque en ce moment sur un truc qu'il doit être tellement simple que je ne le vois pas.

    Depuis un batch, je voudrais lire ligne à ligne le contenu d'un fichier. Chaque ligne avant retour du chariot serait la variable que le batch prendrait en compte pour effectuer une recherche sur le PC scanné. Dés que la ligne 1 a obtenu un résultat il faudrait que la ligne 2 devienne la nouvelle variable et ainsi de suite jusqu'à la dernière ligne.

    Voici mes éléments.
    un fichier "liste.log" contenant:
    toto.exe
    tutu.exe
    titi.txt
    Un batch contenant:
    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
    @for /f "delims=" %%i in ('type "liste.log" ^|findstr /i /r "%target%"') do (
    @if %errorlevel%==0 goto XPdetec
    )
    
    :XPdetec
    @for %%i in (C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Y,Z) do ( 
     if exist "%%i:\" set VrLec=%%i& call :detec %%i 
    ) 
    
    :detec
    for /r "%VrLec%:\" %%j in (%target%) do if exist "%%j" echo %%j >> %systemdrive%\resultat.txt
    goto :eof
    pause
    %target% est la variable que je n'arrive pas à modifier afin de passer de toto.exe à tutu.exe à ...

    Merci!

  2. #2
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    C'est dans l'aide de "set", en fait... Tu tombes très exactement dans le cadre de l'expansion retardée.

    Mets en début de programme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SetLocal EnableDelayedExpansion EnableExtensions
    Ceci activera l'expansion retardée des variables et les extensions de commande.
    Bonus cadeau, ça activera aussi l'environnement local, qui t'évitera donc de "pourrir" ton environnement global avec tes variables de programme.

    Ensuite, dans le code lui-même : l'affectation de ta variable ne change pas (ce que l'on appelle aussi parfois les "L-values", c'est à dire l'identifiant à GAUCHE d'un opérateur d'affectation), mais son utilisation (R-Value) devra être modifiée.

    Le plus simple, c'est encore que je remette ici l'exemple de l'aide du set :
    La prise en charge de l'expansion retardée de variables d'environnement est utile pour contourner les limites de l'expansion en cours qui se produit à la lecture d'une ligne de texte et non à son exécution. L'exemple suivant montre le problème causé par l'expansion immédiate de variables*:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    set VAR=avant
    if "%VAR%" == "avant" (
        set VAR=après
        if "%VAR%" == "après" @echo Cela marche si vous lisez ce message
    )
    n'affichera jamais le message car la variable %VAR% présente dans les deux instances de IF est remplacée à la lecture de la première instance de IF, étant donné que le corps de IF, instruction composée, est logiquement inclus. Donc le IF compris dans l'instance compare "avant" avec "après" et il n'y aura jamais égalité. De même, l'exemple suivant ne fonctionnera pas comme prévu*:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    set LIST=
    for %i in (*) do set LIST=%LIST% %i
    echo %LIST%
    car la liste des fichiers du répertoire ne sera PAS créée, et en fait la variable LIST prendra le valeur du dernier fichier trouvé. Une fois encore cela est dû au fait que %LIST% n'est étendu qu'une fois, lorsque FOR est lu et à ce stade la variable LIST est vide. Donc la boucle FOR exécutée est*:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for %i in (*) do set LIST= %i
    qui donne toujours à LIST la valeur du dernier fichier trouvé.

    L'expansion retardée de variables d'environnement vous permet d'utiliser un autre caractère (le point d'exclamation) afin d'étendre les variables d'environnement durant l'exécution. Si l'expansion retardée de variables est activée, les exemples ci-dessus peuvent être écrits comme suit afin de fonctionner comme vous le souhaitez :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    set VAR=avant
    if "%VAR%" == "avant" (
        set VAR=après
        if "!VAR!" == "après" @echo Cela marche si vous lisez ce message
    )
    
    set LIST=
    for %i in (*) do set LIST=!LIST! %i
    echo %LIST%
    Ta variable "%target%" étant sûrement initialisée ailleurs, il faudra alors l'écrire "!target!" pour être évaluée correctement.

    Au passage : après un "@echo off", préfixer les lignes par "@" n'a aucun intérêt.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 35
    Points : 29
    Points
    29
    Par défaut
    Merci Mac LAK!

    Mais je suis vraiment "nouille" sur ce coup car je n'arrive pas à placer et activer la variable de l'expansion retardée.

    J'ai modifier le batch afin de le faire fonctionner manuellement mais je n'arrive pas à faire la lecture des lignes suivantes dans liste.log contenant toutes les occurences recherchées.
    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
    33
    34
    35
    36
    37
    38
    @echo off
    cls
    if exist "%systemdrive%\resultat.txt" del /q "%systemdrive%\resultat.txt"
    echo          Entrez le nom du fichier sans son extension puis validez.
    Set /p target=         
    echo          Saisissez de nouveau le nom du fichier et validez.
    Set /p target2=         
    if %target%==%target2% goto XPlist
    
    :XPlist
    @echo off
    cls
    echo          Controle de %target% dans la liste
    echo          Patientez !
    ping 0.0.0.0 -n 10 > nul
    for /f "delims=" %%i in ('type "liste.log" ^|findstr /i /r "%target%"') do (
    if %errorlevel%==0 goto XPdetect
    )
    
    :XPdetec
    echo off
    cls
    echo          %target% est autorise !
    echo          %target% en cours de recherche sur tous les lecteurs du PC !
    echo          Le scan peut prendre plusieurs minutes !
    echo          Patientez !
    for %%i in (C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Y,Z) do ( 
     if exist "%%i:\" set VrLec=%%i& call :detec %%i 
    ) 
    goto fin
    
    :detec
    echo off
    for /r "%VrLec%:\" %%j in (%target% %target%.*) do if exist "%%j" echo %%j >> %systemdrive%\resultat.txt
    goto :eof
    
    :fin
    pause
    Si je rentre "toto" > je contrôle qu'il est bien dans la liste et il me ressort tous les emplacements de celui-ci sur les différents disques.
    Ensuite je dois entrer "tutu" > ...
    C'est ce "set Liste=" et "!target!" que je n'arrive pas à placer pour lire "liste.log" >> 1er ligne = toto > scan > résultat
    >> 2éme ligne = tutu > scan > résultat
    >> ...

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 35
    Points : 29
    Points
    29
    Par défaut
    Re,

    Voilà avec l'expansion retardée (tentative) ou je bloque.
    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
    33
    34
    35
    36
    @echo off 
    setlocal enabledelayedexpansion 
    set target=
    Set fichier=liste.log 
    For /R %fichier% %%I In (*.*) Do Set target=!target! 
    goto XPlist
    
    :XPlist
    @echo off
    cls
    echo          Controle de !target! dans la liste
    echo          Patientez !
    ping 0.0.0.0 -n 10 > nul
    for /f "delims=" %%i in ('type "liste.log" ^|findstr /i /r "!target!"') do (
    if %errorlevel%==0 goto XPdetect
    )
    
    :XPdetec
    echo off
    echo          !target! en cours de recherche sur tous les lecteurs du PC !
    echo          Le scan peut prendre plusieurs minutes !
    echo          Patientez !
    for %%i in (C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Y,Z) do ( 
     if exist "%%i:\" set VrLec=%%i& call :detec %%i 
    ) 
    goto fin
    
    :detec
    echo off
    for /r "%VrLec%:\" %%j in (!target! !target!.*) do if exist "%%j" echo %%j >> %systemdrive%\resultat.txt
    goto :eof
    
    :fin
    endlocal
    pause>nul
    Erreur sur Findstr ... et du n'importe quoi dans le rapport
    Je nage ...

  5. #5
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Le premier "for" est foireux : "Set target=!target!" ne fera rien, vu que target est initialisé à rien, et que tu le mets égal à lui-même...

    Ne serait-ce pas "set target=!target! %%I", plutôt ? Ou "echo %%I >> %fichier%" ?

    En tout cas, c'est pas bon dans l'état actuel, c'est certain.

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 35
    Points : 29
    Points
    29
    Par défaut
    Salut!

    Ok je comprends le raisonnement maintenant

    Il faut que je fasse une boucle dans la boucle pour sortir la première ligne en variable et ainsi de suite pour les suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @echo off
    setlocal enableDelayedExpansion 
    for /f %%i in (liste.log) do (
    	for /f "delims=" %%j in ("%%i") do (
    		set target=%%j
    		echo !target!
    		pause
    	)
    )
    endlocal
    A la première sortie je pars sur la détection avec la variable déclarée > ensuite avec un goto je reviens sur la boucle/boucle pour récupèrer la suivante > ... ainsi de suite jusqu' au dernier terme de liste.log

    Cela sent bon!
    Je teste cela et je repasse.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 35
    Points : 29
    Points
    29
    Par défaut
    Re,
    Cela fut plus facile à dire qu'à faire ...

    Maintenant le script tourne correctement et boucle en changeant de variable à chaque retour de chariot (changement de ligne). J'arrive ainsi à retrouver tous les chemins des éléments ciblés.

    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
    33
    34
    @echo off
    cls
    if exist "%systemdrive%\resultat.txt" del /q "%systemdrive%\resultat.txt"
    goto start
    
    :start
    setlocal EnableDelayedExpansion 
    for /f %%i in (liste.log) do (
    	for /F "delims=" %%j in ("%%i") do (
    		set target=%%j
    		goto XPdetec
    	)
    )
    goto fin
    
    :XPdetec
    echo off
    for %%i in (C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Y,Z) do ( 
    	if exist "%%i:\" set VrLec=%%i& call :detec %%i 
    ) 
    goto start
    
    :detec
    echo off
    for /r "%VrLec%:\" %%j in (!target! !target!.*) do if exist "%%j" echo %%j >> %systemdrive%\resultat.txt
    copy liste.log att.txt
    find /v /i "!target!" < att.txt > liste.log
    del att.txt
    goto :eof
    
    :fin
    endlocal
    exit
    liste.log contient mes cibles (toto, titi, tutu,...)

    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Utiliser une variable dans la même page asp
    Par giono dans le forum ASP.NET
    Réponses: 12
    Dernier message: 04/09/2008, 12h21
  2. modifier une variable dans un datagrid
    Par frankbe dans le forum ASP.NET
    Réponses: 6
    Dernier message: 30/07/2008, 15h13
  3. Réponses: 5
    Dernier message: 26/03/2008, 12h22
  4. Réponses: 3
    Dernier message: 22/03/2007, 13h09
  5. modifier une variable dans un fichier
    Par Guismay dans le forum Langage
    Réponses: 7
    Dernier message: 11/09/2005, 19h46

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