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?
Il existe deux méthodes pour définir et utiliser des variables dans la portée des boucles for et des parenthèses.
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 ...
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.
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é.
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