단일 배치 파일 명령에 대한 디렉토리를 임시로 변경합니다.

단일 배치 파일 명령에 대한 디렉토리를 임시로 변경합니다.

쉘 스크립팅에서 디렉토리에서 명령을 실행해야 하는 경우 하위 쉘을 사용하여 원래 컨텍스트로 돌아갈 수 있습니다.

(cd temporary/new/directory ; command)
# now I am still in original directory

Windows 배치 파일(또는 cmd 파일)에서 이 작업을 수행할 수 있습니까?

배치 파일에서 동일한 작업을 수행하면 새 디렉토리에 남게 됩니다.

내가 할 수있는:

pushd temporary\new\directory && command && popd

그러나 popd는 command.

어떤 아이디어가 있나요?

답변1

그렇게 하는 경우:

pushd \windows && foobar && popd

당신은 (당신이 말한 대로) \windows 폴더에 남게 될 것입니다. 노력하다:

pushd \windows & foobar & popd

그리고 당신은 당신이 시작한 곳으로 돌아가야 합니다.

답변2

기본적으로 Windows 배치 파일은 상위 셸의 컨텍스트에서 실행됩니다(명시적인 내용이 source필요한 Unix 사용자에게는 이례적이지만 MS-DOS에서는 유일한 가능성이었습니다). 이는 디렉토리 변경 및 환경 변수가 원래 대화형 셸에도 영향을 미친다는 것을 의미합니다.

setlocal자체 컨텍스트에서 실행되도록 스크립트 상단에 배치하면 cd스크립트 내부에서 안전하게 사용할 수 있습니다.

답변3

이전에 언급한 것처럼 Grawity는 그러한 디렉토리가 없으면 후자가 실패할 수 있기 때문에 pushd \windows && (foobar & popd)더 잘 작동할 것입니다 .pushd \windows & foobar & popd

또한 setlocal및을 사용하면 endlocal여러 로컬 환경을 가질 수 있습니다. 예를 들어 다음과 같습니다.

setlocal

cd dir

command

endlocal

이제 원래 디렉터리로 돌아갑니다.

답변4

배치 스크립트의 시작 부분에 넣으라는 ggrawity의 제안에 박수를 보내지 만 여러 개의 중첩된 / 블록을 setlocal가질 수 있다는 사실을 추가하여 질문에 대한 더 관련성 있는 대답은 다음과 같습니다.setlocalendlocal

@echo off
setlocal
cddir1
  ...
setlocal
cddir2
command
endlocal
:: Now I am back indir1
  ...

cd그리고 물론, 다음과 같은 경우에만 명령이 실행되도록 하려면dir2성공했다, 말하자면cddir2&&command.

setlocal/ 블록 endlocal은 지역화된 환경을 생성하므로 해당 블록에서 설정하거나 변경하는 모든 변수는 endlocal.

관련 정보