쉘 스크립팅에서 디렉토리에서 명령을 실행해야 하는 경우 하위 쉘을 사용하여 원래 컨텍스트로 돌아갈 수 있습니다.
(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
가질 수 있다는 사실을 추가하여 질문에 대한 더 관련성 있는 대답은 다음과 같습니다.setlocal
endlocal
@echo off
setlocal
cd
dir1
...
setlocal
cd
dir2
command
endlocal
:: Now I am back in
dir1
...
cd
그리고 물론, 다음과 같은 경우에만 명령이 실행되도록 하려면dir2
성공했다, 말하자면cd
dir2
&&
command
.
setlocal
/ 블록 endlocal
은 지역화된 환경을 생성하므로 해당 블록에서 설정하거나 변경하는 모든 변수는 endlocal
.