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


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.