Windows에서 배치 스크립트의 경로를 얻는 방법은 무엇입니까?


329

%0배치 스크립트의 전체 경로 가 포함되어 있음을 알고 있습니다.c:\path\to\my\file\abc.bat

나는 path같을 것이다c:\path\to\my\file

어떻게하면 될까요?




1
BTW : % 0은 상대 명령 행으로 bat가 호출 된 경우 전체 경로를 포함하지 않습니다. 따라서이 경우 "% ~ dpf0"이 더 안정적입니다.
eckes

답변:


562

%~dp0디렉토리가 될 것입니다. 다음은 모든 경로 수정 자에 대한 설명서입니다 . 재미있는 것들 :-)

최종 백 슬래시를 제거하려면 :n,m다음과 같이 하위 문자열 구문을 사용할 수 있습니다 .

SET mypath=%~dp0
echo %mypath:~0,-1%

불행히도 %0구문과 구문 을 결합하는 방법이 없다고 생각 :~n,m합니다.


7
훌륭합니다 ... 사용 %~0\..하고 있습니다. 더 나은 방법이 있어야한다는 것을 알고있었습니다! 또한 디렉토리 이름 등에 공백이있는 경우 %~dp0큰 따옴표 ( "")로 묶어야합니다 .
Cameron

1
좋아요! 그러나 %~dp0끝에``가 포함되어 있습니다. 그것을 제거하는 방법에 대한 아이디어가 있습니까?
Misha Moroshko

1
@Misha : 마지막에 '\'를 제거하는 방법을 의미한다고 가정합니다. 자세한 내용으로 답변을 업데이트했습니다.
Dean Harding

2
대답의 예는 경로에 공백이 있어도 따옴표없이 잘 작동합니다. (예 : SET msg=hello world잘 작동합니다). 그러나 다른 곳에서 % mypath %를 사용하는 경우 따옴표로 사용하지 않으려는 경우에도주의해야 cd합니다.
Martin Pain

2
링크는 이제 404입니다
StingyJack

12

"\"뒤에 오는 경로를 얻기 위해 다음 스크립트를 사용할 수 있습니다

for %%i in ("%~dp0.") do SET "mypath=%%~fi"

그래도 경로에서 파일 이름을 제거하지는 않습니다 (예 : OP의 예에서 abc.txt).
dcp

4
그러나 @dcp Er는 그렇지 않습니다.
Kyle Strand

@Kyle Strand-네, 방금 다시 시도했는데 정상적으로 작동합니다. 원래 시도했을 때 무슨 일이 있었는지 잘 모르겠습니다. 어딘가에서 스크립트 어딘가에 실수를했을 수도 있습니다. 혼란을 드려 죄송합니다. 지적 해 주셔서 감사합니다.
dcp

11

%~dp0상대 경로 일 수 있습니다. 전체 경로로 변환하려면 다음과 같이 해보십시오.

pushd %~dp0
set script_dir=%CD%
popd

6
좋아, 왜 %~dp0직접 사용하지 않습니까?
jpaugh

5
5 년 후에 게시 된 답변 중 더 나쁜 버전은? 이해가 안 돼요
Kyle Strand

이 답변이 허용 된 답변의 의견에 언급 된 문제를 해결하기 위해 게시되었다고 생각합니다 %~dp0. 사용 사례에 따라 문제가 될 수도 있고 그렇지 않을 수도 있습니다.
Michael Mrozek

10
%~dp0상대 경로를 포함 할 수없고, d드라이브와 경로를 나타내며 p, 드라이브가 상대적인 방법은 무엇입니까?
jeb

5
어느 세상에서? 방금 Windows Server 2012 r2 에서이 답변을 테스트 %~dp0했으며 스크립트가 상대 경로로 실행 된 경우에도 절대 경로가 될 것입니다. jeb의 의견 덕분에 나는이 대답에 속지 않았습니다. 사람들은 왜 물건을 만들어 가서 그들의 상상력을 다른 사람들에게 전하기 시작합니까? 나는이 일을하는이 동료를 가지고 있지만 나는 그의 (젊은) 나이를 비난했다. 다운 투표가 중요합니다.
bitoolean

0

당신이 사용할 수있는 %~dp0, D 수단 드라이브 만 P 수단의 경로는, 0은 배치 파일의 전체 파일 이름에 대한 인수입니다.

예를 들어 파일 경로가 C : \ Users \ Oliver \ Desktop \ example.bat 인 경우 인수는 C : \ Users \ Oliver \ Desktop \과 같습니다. 또한 명령 set cpath=%~dp0 && set cpath=%cpath:~0,-1%을 사용하고 %cpath%변수를 사용 하여 후행 슬래시를 제거 할 수 있습니다 .


1
9 살짜리 답변보다 더 많은 정보를 볼 수 없습니다
jeb

추가 정보는 "d는 드라이브만을 의미합니다."등입니다. @Hayz 감사합니다.
RJ Dunnill '

-2

%cd% 스크립트가 실행되는 디렉토리의 경로를 제공합니다.

그냥 실행 :

echo %cd%

%CD%배치 파일이 저장된 폴더가 아닌 현재 작업 폴더입니다. 그들은 같은 위치 일 수 있지만 종종 그렇지 않습니다.
Stephan

-7

그것은 %CD%변수 일 것입니다.

@echo off
echo %CD%

%CD% 배치 스크립트가있는 현재 디렉토리를 반환합니다.


35
% cd %는 스크립트가있는 디렉토리가 아니라 스크립트가 실행 된 디렉토리를 반환합니다.
Misha Moroshko

4
스크립트가 작업 디렉토리를 수정하지 않는 경우에만 작동합니다. 시도 CD C:\Temp <CR> ECHO %CD%( <CR>줄 바꿈입니다 ...)
딘 하딩

6
또한 스크립트를 마우스 오른쪽 단추로 클릭하고 "관리자 권한으로 실행"을 선택하면 스크립트의 위치에 관계없이 시작 현재 디렉토리는 C : \ Windows \ System32입니다.
카메론

OP의 질문에 대한 직접적인 대답은 아니지만이 기능의 풍미는이 질문을 찾았을 때 찾고 있던 것입니다. 감사!
Zoltán

게시 된 다른 솔루션 중 어느 것도 Win7 32bit cmd.exe에서 작동하지 않는 것 같습니다. 적어도 유용합니다.
Clifford

-8

Windows 7 컴퓨터에서 작업 중이며 아래 줄을 사용하여 bash 스크립트의 절대 폴더 경로를 얻었습니다.

http://www.linuxjournal.com/content/bash-parameter-expansion보고이 솔루션에 도달했습니다 .

#Get the full aboslute filename.
filename=$0
#Remove everything after \. An extra \ seems to be necessary to escape something...
folder="${filename%\\*}"
#Echo...
echo $filename
echo $folder

2
OP는 bash가 아닌 Windows BAT / CMD 쉘 스크립트에 대해 묻고 있습니다.
rivy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.