명령 줄 .cmd / .bat 스크립트, 실행중인 스크립트의 디렉터리를 가져 오는 방법


답변:


58

Raymond Chen은 몇 가지 아이디어를 가지고 있습니다.

https://devblogs.microsoft.com/oldnewthing/20050128-00/?p=36573

MSDN 아카이브는 다소 불안정한 경향이 있으므로 여기에 전체를 인용했습니다.

쉬운 방법은 %CD%의사 변수 를 사용하는 것 입니다. 현재 작업 디렉토리로 확장됩니다.

set OLDDIR=%CD%
.. do stuff ..
chdir /d %OLDDIR% &rem restore current directory

(물론, 저장 / 복원 디렉토리는 더 쉽게 함께 할 수 있었다 pushd/ popd하지만 여기 지점이 아니다.)

%CD%트릭은 명령 줄에서 편리도 있습니다. 예를 들어, 작업 할 파일이있는 디렉토리에있는 경우가 많지만 ... 오, 해당 작업을 수행하려면 다른 디렉토리로 chdir해야합니다.

set _=%CD%\curfile.txt
cd ... some other directory ...
somecommand args %_% args

( %_%스크래치 환경 변수 로 사용 하고 싶습니다.)

SET /?명령 프로세서에서 제공하는 다른 의사 변수를 보려면 입력 하십시오.

또한 기사의 주석은 예를 들어이 기사를 스캔 할 가치가 있습니다 (기존 기사에서 주석이 제거되었으므로 WayBack Machine을 통해).

http://blogs.msdn.com/oldnewthing/archive/2005/01/28/362565.aspx#362741

여기에는 % ~ dp0 사용이 포함됩니다.

배치 파일이 어디에 있는지 알고 싶다면 : %~dp0

%0배치 파일의 이름입니다. ~dp지정된 인수의 드라이브 및 경로를 제공합니다.


13
이것은 질문에 대한 답이 아닙니다. % CD %는 현재 디렉토리를 제공하고 요청 된 것은 스크립트의 디렉토리였습니다.
ketorin

3
@ketorin : 이것은 질문 대답합니다. % CD %는 스크립트 자체가 사용하는 동안 디렉토리를 변경하면 (pushd / cd / ..) 변경 되지만 % ~ dp0 은 변경 되지 않고 항상 스크립트가있는 위치를 가리 킵니다.
Jay

-1 이것이 질문에 대한 답인지 아닌지 모르겠습니다. 예를 보여줄 수 있습니까?
이안 사무엘 맥클린 장로

1
@IainElder-아마도 당신이 맞을 것입니다. 며칠 전에이 답변을 다시 방문했으며 너무 만족스럽지 않았습니다. 제가 언급 한 Raymond Chen의 블로그에 대한 댓글은 MS에 의해 블리츠 된 것 같습니다. 따라서 링크 된 외부 소스에 전적으로 의존하는 답변의 위험이 있습니다. 나는 내 대답을 뒷받침하기 위해 다른 자료를 찾으려고 노력했지만 지금은 너무 오래 전의 안개 속에 있습니다. 삭제 플래그를 지정합니다. 이걸로 끝까지 알려 주셔서 감사합니다 :) 당신은 SkyScanner에서 일하지 않습니까?
케브

1
@Kev 유용한 부분을 Stack Overflow에 복사하면 외부 소스를 참조하는 것이 좋습니다. 이제 너무 늦었 나봐요! 그리고 예, 나는 Skyscanner 데이터 센터에 숨어있는 것으로 알려져 있습니다 ;-)
장로 이안 사무엘 맥클린

147

이것은 스크립트의 경로와 동일합니다.

%~dp0

이것은 배치 매개 변수 확장 구문을 사용합니다. 매개 변수 0은 항상 스크립트 자체입니다.

스크립트가에 저장되어 있으면 C:\example\script.bat%~dp0평가됩니다 C:\example\.

ss64.com 에는 매개 변수 확장 구문에 대한 자세한 정보가 있습니다. 관련 발췌문은 다음과 같습니다.

명령 줄에서 % 뒤에 숫자 위치를 사용하여 모든 매개 변수의 값을 가져올 수 있습니다.

[...]

매개 변수를 사용하여 파일 이름을 제공하면 다음 확장 구문을 적용 할 수 있습니다.

[...]

% ~ d1 % 1을 (를) 드라이브 문자로만 확장합니다.-C :

[...]

% ~ p1 % 1을 경로로만 확장합니다 (예 : \ utils \). 여기에는 일부 명령에서 이스케이프 문자로 해석 될 수있는 후행 \이 포함됩니다.

[...]

위의 수정자를 결합 할 수 있습니다.

% ~ dp1 % 1을 드라이브 문자와 경로로만 확장합니다.

[...]

% 0을 사용하여 배치 스크립트 자체의 경로 이름을 가져올 수 있으며, 여기에 매개 변수 확장을 적용 할 수 있으므로 % ~ dp0은 배치 스크립트에 대한 드라이브 및 경로 (예 : W : \ scripts \)를 반환합니다.


정확히 내가 필요한 것. 그리고는 : 상기시켜, 내 블로그에이 anwser를 연결
올리비에 H

인용 된 텍스트의 버그 / 오류인지 확실하지 않지만 스크립트에서 드라이브 문자를 얻으려면 "% ~ d0"이 필요합니다! 제 경우에는 % ~ d1이 비어 있습니다.
fklappan

내 눈 / 상황에서 이것은 허용되는 대답보다 우수합니다. "관리자 권한"으로 명령 줄 스크립트를 실행하면 (오른쪽 클릭) Windows \ system32에서 스크립트가 실행됩니다. 수락 된 대답은 스크립트 위치를 제공하지 않으며 Windows \ system32를 다시 제공합니다. 즉 본의 대답은 당신이 그 문제를 해결, 당신이 CD를 %로 스크립트를 시작하는 데 도움이 ~ DP0
야로슬라프 Záruba

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