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


19

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

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

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

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

내가 할 수있는:

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

그러나 팝은의 성공에 달려있다 command.

어떤 아이디어?


"일괄 파일"또는 "cmd 파일"을 어떻게 호출합니까? cd 명령을 쉘 스크립트에 넣고 해당 스크립트 (소스가 아닌)를 실행하면 호출 쉘의 현재 작업 디렉토리가 변경되지 않습니다.
garyjohn

분명히 이것은 Windows 배치 파일을 나타냅니다.
Greg

디렉토리 트리의 다른 부분에서 많은 명령을 실행하는 스크립트입니다. 일부 명령은 현재 디렉토리에서만 작동합니다. 원래 디렉토리로 돌아 가면 스크립트를 구동하는 데이터를 단순화하는 데 도움이됩니다. 전화를 걸 필요가있는 각 디렉토리마다 별도의 배치 파일을 만들 것을 제안하고 있습니까?
그렉

내가 기억 하듯이 쉘 스크립트를 언급하고 원래 질문에 Windows를 언급하지 않았으므로 Unix와 같은 시스템을 사용하고 있다고 잘못 가정했습니다. 지금은 이해.
garyjohn

예, 죄송합니다. 명확하지 않다는 것을 알고 있습니다 ( '일괄 파일'은 힌트라고 생각하지만 :-p)
Greg

답변:


21

당신이 할 경우 :

pushd \windows && foobar && popd

\ windows 폴더에 (상태대로) 남아 있습니다. 시험:

pushd \windows & foobar & popd

시작한 곳을 다시 찾아야합니다.


1
아, 단일 앰퍼샌드는 sh의 세미콜론과 같습니다. 저건 완벽 해. (및 참조 : ss64.com/nt/syntax-conditional.html )
Greg

6
cd/ pushd때때로 실패 한다는 것을 기억하는 것이 좋습니다 (예를 들어 디렉토리가 존재하지 않는 경우). pushd \windows && (foobar & popd)더 신뢰할 수 있습니다
grawity

16

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

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


감사합니다. 필요한 것 같습니다. Windows 컴퓨터에 액세스 할 때 확인하겠습니다. 괄호를 사용하는 하위 명령에 영향을 줍니까?
그렉

1
@ Greg : ( )그룹 명령 만 그룹화 하는 것처럼 보이지만 여전히 부모 컨텍스트에서 실행합니다. (setlocal & cd foo & bar)작동 안 할 것이다; 대신에 pushd foo && (bar & popd)필요할 것입니다.
grawity

4

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

또한 여러 로컬 환경을 사용 setlocal하고 endlocal사용할 수 있으므로 예를 들면 다음과 같습니다.

setlocal

cd dir

command

endlocal

이제 원래 디렉토리로 돌아 왔습니다.


3

cd -이전 작업 디렉토리로 돌아가는 데 사용할 수 있습니다 . 그리고 ;대신에 사용 &&하면 후속 명령은 이전 명령의 성공에 의존하지 않습니다.

$ pwd
/etc
$ cd /var ; pwd ; cd -
/var
$ pwd
/etc

Windows 배치 / 쉘 스크립팅에 대해 묻고 있음을 명확히하기 위해 질문을 업데이트했습니다. 나는 sh-like shell에서 그것을하는 방법을 안다 :)
Greg

BillP3rd가 ';'에 해당하는 것을 지적했듯이 배치 파일에서 '&'입니다.
그렉

아 죄송합니다 슬래시를 사용하면 UNIX라고 생각하게되었습니다.
bahamat

1

setlocal배치 스크립트의 시작 부분에 grawity의 제안을 박수로 보내지 만 여러 개의 중첩 된 setlocal/ endlocal블록을 가질 수 있다는 사실을 추가 하여 질문에 대한 관련성이 더 높을 수 있습니다.

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

물론 cdto dir2가 성공한 경우에만 명령을 실행하려면 이라고 말하십시오 .cddir2&&command

있습니다 setlocal/의 endlocal모든 변수는 사용자가 설정하는 것이 또는 블록에 변화가 후 이전 값으로 되돌릴 수 있도록 블록, 지역화 된 환경을 만들어 endlocal.


0

현재 디렉토리를 변수에 저장할 수 있습니다. 명령의 반환 값에 따라 변경하고 다시 변경하십시오. BTW, % CD %는 현재 DIR을 반환합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.