UNC 경로에 pushd를 사용한 후 %CD%가 작동하지 않는 이유는 무엇입니까?

UNC 경로에 pushd를 사용한 후 %CD%가 작동하지 않는 이유는 무엇입니까?

배치 파일에서는 pushd를 사용하여 해당 위치로 컨텍스트를 변경한 다음 명령을 실행하여 파일의 unc 경로 목록을 반복합니다. %CD%는 현재 푸시된 디렉터리가 아닌 이전 디렉터리의 위치를 ​​제공합니다.

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
)

현재 디렉토리를 어떻게 얻나요?

답변1

%CD%제대로 작동합니다. 문제는 그것이 확장되었다는 것입니다~ 전에루프 for도 실행됩니다. 대신 지연된 확장을 사용하세요.

setlocal enabledelayedexpansion
for /f "tokens=*" %%A in (filesharelist.txt) do (
 pushd %%A
 echo CD=!CD!
 REM xcopy *.xml %DestinationDirectory% /V /C /Y /Z
 popd
)

변수 확장은 cmd약간 반직관적입니다. 명령문이 다음과 같은 경우 일반 환경 변수( , , ... %foo%와 같은 의사 변수를 포함하는 형식 )가 확장됩니다.%date%%cd%파싱된, 실행될 때가 아닙니다. 단일 명령문으로 count를 따르는 것과 같은 블록 do이므로 블록의 모든 변수가 해당 값으로 대체됩니다.~ 전에루프 for도 실행됩니다. 즉, %CD%원래 있던 값으로 대체된다는 의미입니다.~ 전에루프. 놀랍게도 이 값은~ 전에.pushd

지연 확장은 명령문이 실행되기 직전에 변수를 확장하여 문제를 해결합니다.처형된. !foo!하지만 이를 위해서는 양식 을 사용해야 합니다 .그리고명시적으로 활성화하거나 setlocal enabledelayedexpansion시작 cmd해야 cmd /v:on하거나 레지스트리에서 활성화해야 합니다. 외부 구성이나 환경에 의존하지 않기 때문에 가장 안전한 방법은 첫 번째입니다.

보너스 퀴즈: 왜? %DestinationDirectory% 아직도 의도한 대로 작동하나요?

관련 정보