2009-06-11 8 views
2

Haben Sie nicht wissen, wie diese gut zu erklären, ist so hier den CodeCMD For-Schleife nicht gilt gesetzt/Wert

@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 

dies ist nur ein Beispiel dafür, wo ich das Problem bin zu finden, txtfile. txt hat 5 Zeilen, so dass die for-Schleife 5 mal geht, jedes Mal bekommt der Test +1, und das/a zeigt den korrekten Wert von X an, aber das letzte Echo in der for-Schleife zeigt 0 an, was Test ist auf vor der Schleife eingestellt.

Der Wert des Tests ändert sich nicht, bis die Schleife beendet ist ... gibt es eine Möglichkeit, dies zu beheben?

Hier ist, was ich erreichen möchte, da es einen einfacheren Weg geben kann: Ich möchte eine for-Schleife ausführen, die alle RTF-Dateien in einer Reihe von Unterordnern findet und alle in ein Verzeichnis mit einem neuen Namen kopiert , 1.rtf, 2.rtf, 3.rtf usw. Der Grund, warum ich sie bei der Übertragung umbenennen muss, ist, dass sie alle den gleichen Namen haben.

Antwort

2

Möglicherweise müssen Sie die verzögerte Umgebungsvariablenerweiterung verwenden. Siehe CMD /? Weitere Hilfe hierzu:

/V: ON Enable verzögerte Umgebung Variable Erweiterung mit! als der Begrenzer. Zum Beispiel würde/V: ON erlauben! Var! um die Variable Var zur Ausführungszeit zu erweitern. Die var-Syntax erweitert Variablen bei Eingabe Zeit, die eine ganz andere Sache ist, wenn innerhalb einer FOR Schleife.

...

Delayed Umgebung variable Erweiterung ist standardmäßig nicht aktiviert. Sie können aktivieren oder deaktivieren verzögerte Umgebung Variable Erweiterung für eine bestimmte Aufruf von CMD.EXE mit dem/V: ON oder/V: OFF-Schalter. Sie können für alle Aufrufe des Befehls einer Maschine oder deaktivieren verzögerten Expansion ermöglichen und/oder Benutzeranmeldesitzung durch Einstellung eines oder beide der folgenden REG_DWORD Werte in der Registrierung unter Verwendung REGEDIT.EXE:

HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\DelayedExpansion 

und/oder

HKEY_CURRENT_USER\Software\Microsoft\Command Processor\DelayedExpansion 

entweder zu 0x1 oder 0x0. Der Benutzer spezifische Einstellung hat Vorrang vor der Maschineneinstellung. Die Befehlszeilenschalter haben Vorrang vor den Registrierungseinstellungen .

Wenn verzögerte Umgebungsvariable Expansion aktiviert ist, dann wird das Ausrufungszeichen kann zur Ausführungszeit den Wert einer Umgebungsvariable Ersatz verwendet werden.

4

Lucero ist richtig.

Beispielcode:

@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

Wie wäre es, '%% a'-Wert an eine For-Loop-Variable zu übertragen? Kann es nur für Stunden erreichen – xacinay

0

Ich wollte nur, dass der Schlüssel hinzufügen, um unter Verwendung von verzögerten Expansion die Variable mit dem var verweist! Syntax im Vergleich zu% var%. Am besten kann ich in XP sagen, dass die verzögerte Erweiterung standardmäßig aktiviert ist, Sie müssen nur auf die Variable verweisen, indem Sie! Das hat meine Schleife repariert. Fanden Sie dies in der Hilfe, die von den anderen Plakaten erwähnt wird:

Enable verzögerte Umgebungsvariable Expansion mit! als der Begrenzer. Zum Beispiel:/V: ON würde erlauben! Var! um die Variable Var zur Ausführungszeit zu erweitern. Die var-Syntax erweitert die Variablen zur Eingabezeit, was eine ganz andere Sache ist, wenn innerhalb einer FOR Schleife.

übersehen ich die !! bisschen zuerst.