in einer Batchdatei durchlaufe ich eine Liste von UNC-Pfaden in einer Datei, verwende pushd, um den Kontext an diesen Speicherort zu ändern, und führe dann einen Befehl aus. %CD% gibt den Speicherort des vorherigen Verzeichnisses an, nicht des aktuell gepushten Verzeichnisses.
for /f "tokens=*" %%A in (filesharelist.txt) do (
pushd %%A
echo CD=%CD% - expecting x:\ or x:\subpath here, but get previous directory
REM xcopy *.xml %DestinationDirectory% /V /C /Y /Z
popd
)
Wie erhalte ich das aktuelle Verzeichnis?
Antwort1
%CD%
funktioniert wie es soll. Ihr Problem ist, dass es erweitert istVorIhre for
Schleife läuft sogar. Verwenden Sie stattdessen eine verzögerte Erweiterung:
setlocal enabledelayedexpansion
for /f "tokens=*" %%A in (filesharelist.txt) do (
pushd %%A
echo CD=!CD!
REM xcopy *.xml %DestinationDirectory% /V /C /Y /Z
popd
)
Die Variablenerweiterung in cmd
ist etwas kontraintuitiv. Normale Umgebungsvariablen (der %foo%
Form, einschließlich Pseudovariablen wie %date%
, %cd%
, ...) werden erweitert, wenn eine Anweisunganalysiert, nicht, wenn es ausgeführt wird. Blöcke wie der folgende do
zählen als einzelne Anweisung, sodass jede Variable im Block durch ihren Wert ersetzt wirdVordie for
Schleife läuft sogar. Was bedeutet, %CD%
wird durch den Wert ersetzt, den es hatteVordie Schleife. Wenig überraschend ist dies der WertVorDie pushd
.
Die verzögerte Erweiterung umgeht das Problem, indem Variablen direkt vor der Anweisung erweitert werden.hingerichtet!foo!
. Dafür müssen Sie allerdings das Formular verwenden .Undes muss explizit aktiviert werden setlocal enabledelayedexpansion
oder cmd
gestartet werden cmd /v:on
oder in der Registrierung aktiviert werden. Der sicherste Weg ist der erste, da er nicht von einer externen Konfiguration oder Umgebung abhängt.
Bonus-Quiz: Warum tut %DestinationDirectory%
noch wie vorgesehen?