warum funktioniert %CD% nicht, nachdem pushd zu einem UNC-Pfad verwendet wurde?

warum funktioniert %CD% nicht, nachdem pushd zu einem UNC-Pfad verwendet wurde?

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 forSchleife 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 cmdist 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 dozählen als einzelne Anweisung, sodass jede Variable im Block durch ihren Wert ersetzt wirdVordie forSchleife 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 enabledelayedexpansionoder cmdgestartet werden cmd /v:onoder 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?

verwandte Informationen