2012-04-13 8 views
0

Batch Inhalt:Anhand der Daten aus Textdatei im Batch-Skript

FOR /F "tokens=1,*" %%i IN (list.txt) DO (
    cd "%%j" 
    Echo %CD% 
    pause 
) 

Execution Lauf:

C:\Dwn>tmp1.bat 

C:\Dwn>FOR /F "tokens=1,*" %i IN (list.txt) DO (
cd "%j" 
Echo C:\Dwn 
pause 
) 

C:\Dwn>(
cd "%APPDATA%\Microsoft\Windows\Start Menu\Programs\Administrative Tools" 
Echo C:\Dwn 
pause 
) 
The system cannot find the path specified. 
C:\Dwn 
Press any key to continue . . . 

Wie kommt the system cannot find the path specified? Wenn ich den Befehl cd kopiere und ihn selbst ausführe, funktioniert es einwandfrei.

Antwort

2

Es schlägt fehl, da der Wert von %% j% APPDATA% enthält. Der Wert von% APPDATA% wird nicht erweitert, wenn Sie %% j erweitern, da die Expansion der Umgebungsvariablen vor der FOR-Variablenerweiterung erfolgt.

Der Fix ist stattdessen zu verwenden call cd "%%j". Der Befehl CALL bewirkt, dass der Befehl eine zusätzliche Stufe der% VAR% -Expansion durchläuft, was genau das ist, was Sie wollen.

Sie haben auch ein Problem, dass Sie echo %CD% innerhalb des gleichen DO-Codeblocks verwenden. Es wird den Wert des aktuellen Verzeichnisses vor der Änderung wiedergeben, da der Wert von% CD% erweitert wird, wenn die gesamte FOR-Anweisung analysiert wird. Sie können dies beheben, indem Sie call echo %CD% verwenden oder die verzögerte Erweiterung mit SETLOCAL EnableDelayedExpansion aktivieren und echo !CD! verwenden. Aber die einfachste Lösung ist einfach cd; Der CD-Befehl ohne Argumente wird das aktuelle Verzeichnis auf dem Bildschirm ausgeben.

+0

vielen dank! für beide Lösungen und Erklärung – flamey