web-dev-qa-db-fra.com

Comment définir une variable dans une boucle pour / F

J'ai fait ce code

dir /B /S %RepToRead% > %FileName%

for /F "tokens=*" %%a in ('type %FileName%') do (
    set z=%%a
    echo %z%
    echo %%a
)

echo %%a fonctionne bien mais echo %z% renvoie "écho désactivé".

Je dois définir un% z% parce que je veux séparer la variable comme %z:~7%

Des idées?

41
Chris

Il existe deux méthodes pour définir et utiliser des variables dans la portée des boucles for et des parenthèses.

  1. setlocal enabledelayedexpansion Voir setlocal /? Pour obtenir de l'aide. Cela ne fonctionne que sur XP/2000 ou les versions plus récentes de Windows. utilisez ensuite !variable! au lieu de %variable% dans la boucle ...

  2. Créez une fonction batch en utilisant les étiquettes batch :Label.

    Exemple:

    for /F "tokens=*" %%a in ('type %FileName%') do call :Foo %%a
    goto End
    
    :Foo
    set z=%1
    echo %z%
    echo %1
    goto :eof
    
    :End
    

    Les fonctions batch sont un mécanisme très utile.

57
David Ruhmann

Vous voulez probablement SETLOCAL ENABLEDELAYEDEXPANSION. Voir https://devblogs.Microsoft.com/oldnewthing/20060823-00/?p=2999 pour plus de détails.

Fondamentalement: Normal %variables% sont développés juste aprèscmd.exe lit la commande. Dans votre cas, la "commande" est l'ensemble

for /F "tokens=*" %%a in ('type %FileName%') do (
    set z=%%a
    echo %z%
    echo %%a
)

boucle. À ce stade, z n'a pas encore de valeur, donc echo %z% se transforme en echo. Ensuite, la boucle est exécutée et z est défini, mais sa valeur n’est plus utilisée.

SETLOCAL ENABLEDELAYEDEXPANSION active une syntaxe supplémentaire, !variable!. Cela élargit également les variables, mais uniquement avant que chaque (sous-) commande soit exécutée.

SETLOCAL ENABLEDELAYEDEXPANSION
for /F "tokens=*" %%a in ('type %FileName%') do (
    set z=%%a
    echo !z!
    echo %%a
)

Cela vous donne la valeur actuelle de z à chaque fois que echo est exécuté.

35
melpomene

J'ai lutté pendant de nombreuses heures à ce sujet. Ceci est ma boucle pour enregistrer vars en ligne de commande. Exemple: Register.bat/param1: valeur1/param2: valeur2

Ce qui est fait, c’est boucler tous les paramètres de la ligne de commande, et définir la variable avec le nom approprié à la valeur.

Après cela, vous pouvez simplement utiliser set value =! Param1! définir la valeur2 =! param2!

quelle que soit la séquence, les paramètres sont donnés. (paramètres dits nommés). Notez le! <> !, au lieu du% <>%.

SETLOCAL ENABLEDELAYEDEXPANSION

FOR %%P IN (%*) DO (
    call :processParam %%P
)

goto:End

:processParam [%1 - param]

    @echo "processparam : %1"
    FOR /F "tokens=1,2 delims=:" %%G IN ("%1") DO (
        @echo a,b %%G %%H
        set nameWithSlash=%%G
        set name=!nameWithSlash:~1!
        @echo n=!name!
        set value=%%H
        set !name!=!value!
    )
    goto :eof

:End    
9
roland roos