배치 파일에서는 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%
아직도 의도한 대로 작동하나요?