2009-06-11 7 views
2

Je ne savais pas comment expliquer ce puits, alors voici le codeCMD boucle For ne tient pas dans/une valeur

@echo off 
set test=0 

for /f %%a in (textfile.txt) do (
rem loops five times(5 lines in textfile.txt) 

set /a test=test+1 
rem Adds 1 to Test 

echo %%a 
rem Echo's correct line in file 

echo %test% 
rem Echo's whatever X was before the loop 

) 

echo %test% 
rem Displays the correct value of X 

pause 

c'est juste un exemple où je trouve le problème, txtfile. txt a 5 lignes, donc la boucle for va 5 fois, chaque fois, le test lui donne +1, et le/a affiche la valeur correcte de X, mais le dernier écho de la boucle for affiche 0, ce qui est le test mis à avant la boucle.

La valeur du test ne change pas jusqu'à ce que la boucle soit terminée ... est-il possible de résoudre ce problème?

Voici ce que je veux accomplir, car il peut y avoir un moyen plus simple: Je veux lancer une boucle for findstr tous les rtf dans une série de sous-dossiers, et les copie tous dans un répertoire avec un nouveau nom , 1.rtf, 2.rtf, 3.rtf, etc. La raison pour laquelle je dois les renommer sur le transfert est qu'ils ont tous le même nom.

Répondre

2

Vous devrez peut-être utiliser une extension de variable d'environnement retardée. Voir CMD /? pour plus d'aide à ce sujet:

/V: ON Activer l'environnement différé extension de variable en utilisant! en tant que délimiteur . Par exemple,/V: ON permettrait! Var! pour développer la variable var à l'exécution. La syntaxe var développe les variables au moment de l'entrée, ce qui est tout à fait une chose différente quand à l'intérieur d'une boucle FOR .

...

environnement Delayed expansion des variables n'est pas activé par défaut. Vous pouvez activer ou désactiver l'extension de variable de l'environnement différé pour un appel particulier de CMD.EXE avec le commutateur/V: ON ou/V: OFF. Vous pouvez activer ou désactiver expansion retardée pour tous les invocations de cmd.exe sur une machine et/ou de la session d'ouverture de session utilisateur en définissant ou les deux des valeurs REG_DWORD suivantes dans le registre à l'aide REGEDIT.EXE:

HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\DelayedExpansion 

et/ou

HKEY_CURRENT_USER\Software\Microsoft\Command Processor\DelayedExpansion 

soit 0x1 ou 0x0. Le réglage spécifique de l'utilisateur a priorité sur pour le réglage de la machine. Les commutateurs de ligne de commande ont priorité sur les paramètres de registre .

Si l'environnement retardé variable de l'expansion est activée, le point d'exclamation peut être utilisé pour remplacer la valeur d'un variable d'environnement au moment de l'exécution.

4

Lucero est exact.

code Exemple:

@echo off 
setlocal enabledelayedexpansion 
echo. 
set numLines=0 
echo examining file '%~f0' 
echo. 
rem loop N times, once for each line in the file 
for /f %%a in (%~f0) do (

    rem add 1 to the numLines variable 
    set /a numLines=!numLines!+1 

    rem echo the first symbol from the line 
    echo line !numLines!: %%a 
) 

rem Display the number of lines in the file 
echo. 
echo The file '%~f0' has %numLines% lines. 
echo. 

pause 
echo. 
endlocal 
+0

Que diriez-vous de transmettre la valeur '%% a' à n'importe quelle variable de boucle for? Juste ne peux pas y arriver pendant des heures – xacinay

0

Je voulais juste ajouter que la clé d'expansion retardée en utilisant la variable fait référence à l'aide du var! syntaxe par rapport à% var%. Le meilleur que je peux dire dans XP retardé l'expansion est activé par défaut, il suffit de faire référence à la var en utilisant! Cela a fixé ma boucle. Trouvé dans l'aide mentionnée par les autres affiches:

Activer l'expansion de variable d'environnement retardée en utilisant! en tant que délimiteur . Par exemple,/V: ON autoriserait! Var! pour développer la variable var à l'exécution. La syntaxe var étend les variables au moment de l'entrée, ce qui est une chose tout à fait différente à l'intérieur d'une boucle FOR .

J'ai négligé le !! peu au début.