% ~ dp0은 무엇을 의미하며 어떻게 작동합니까?


1022

나는 %~dp0매우 유용하다고 생각하며 배치 파일을보다 이식성이있게 만들기 위해 많이 사용합니다.

그러나 레이블 자체는 나에게 매우 비밀스러워 보입니다 ... 무엇을 ~하고 있습니까? dp드라이브와 경로를 의미 합니까 ? 파일 이름이 포함 된 배치 파일의 경로를 0참조 합니까 %0?

아니면 이상한 라벨입니까?

문서화 된 기능인지 또는 더 이상 사용되지 않는 것이 있는지 알고 싶습니다.



2
네 말이 맞아, 헬렌 % ~ dp0을 검색 할 때 해당 질문이 표시되지 않았습니다. 제목에 % ~ dp0 대신 % ~ d0이 (가)있을 수 있습니다.
Sebastián Grignoli

9
SymbolHound 는 영숫자 이외의 문자를 검색하는 데 유용 합니다. 예를 들어을 검색하십시오%~dp0 . 일반적으로 최고의 인기는 SO의 콘텐츠를 참조하는 것으로 나타났습니다.
DavidRR

SymbolHound.com/?q=%25~dp0 검색에서 SymbolHound가 작동하지 않았습니다 . 그러나이 일 : google.com/search?q=%25~dp0 - 그냥 선생님 '...
크리스토퍼

1
SymbolHound 2019 : 작동하지 않으며 uMatrix는 blockchain.info 및 paypalobjects.com과 같은 타사 사이트에 연결되어 있음을 나타냅니다.
Nils Lindemann

답변:


810

부름

for /?

명령 행에서이 구문에 대한 도움말을 제공합니다 (FOR 외부에서도 사용할 수 있음). 도움말을 찾을 수있는 곳입니다.

또한 FOR 변수 참조의 대체가 향상되었습니다. 이제 다음과 같은 선택적 구문을 사용할 수 있습니다.

%~I         - expands %I removing any surrounding quotes (")
%~fI        - expands %I to a fully qualified path name
%~dI        - expands %I to a drive letter only
%~pI        - expands %I to a path only
%~nI        - expands %I to a file name only
%~xI        - expands %I to a file extension only
%~sI        - expanded path contains short names only
%~aI        - expands %I to file attributes of file
%~tI        - expands %I to date/time of file
%~zI        - expands %I to size of file
%~$PATH:I   - searches the directories listed in the PATH
               environment variable and expands %I to the
               fully qualified name of the first one found.
               If the environment variable name is not
               defined or the file is not found by the
               search, then this modifier expands to the
               empty string

수정자를 결합하여 복합 결과를 얻을 수 있습니다.

%~dpI       - expands %I to a drive letter and path only
%~nxI       - expands %I to a file name and extension only
%~fsI       - expands %I to a full path name with short names only
%~dp$PATH:I - searches the directories listed in the PATH
               environment variable for %I and expands to the
               drive letter and path of the first one found.
%~ftzaI     - expands %I to a DIR like output line

위의 예에서 % I 및 PATH는 다른 유효한 값으로 대체 될 수 있습니다. % ~ 구문은 유효한 FOR 변수 이름으로 종료됩니다. % I와 같은 대문자 변수 이름을 선택하면 더 읽기 쉽고 대소 문자를 구분하지 않는 수정 자와 혼동되지 않습니다.

f"전체 경로 이름", d드라이브 문자, 경로 와 같이 사용할 수있는 다른 문자 p가 있으며 조합 할 수 있습니다. %~각 시퀀스의 시작 부분이며 숫자 I는 매개 변수에서 작동 함을 나타냅니다 %I(여기서 %0배치 파일의 전체 이름은 가정 한대로).


2
다른 사람에 대해서는 모르지만 "일괄 매개 변수 대체에서 다음 경로 연산자 사용법이 유효하지 않습니다. 유효한 형식의 경우 CALL /? 또는 FOR / ?. 명령 구문이 올바르지 않습니다." 를 사용할 때 I. 0대신에 사용해야 합니다 I. 무엇인가 놓친 것이 있는지는 모르지만 사람들에게 알리는 것입니다.
mythofechelon 2016 년

71
@BenHooper I는 변수 인덱스의 자리 표시 자입니다. 0= 호출 파일, 1= 인수 # 1, 2= 인수 # 2 등
Chris

9
이 대답은 좋습니다. 그리고 철저한. 좀 더 간결하게하기 위해, 나는 거의 중복되는 질문에 대한 답변을 좋아한다 : stackoverflow.com/questions/112055/…
Frank Nocke

1
이 대체는 FOR 외부에서 사용할 수 있기 때문에이 대답은 약간 혼란 스럽습니다.
David

346

(먼저 배치에 대한이 유용한 참조 사이트를 추천하고 싶습니다 : http://ss64.com/nt/ )

그런 다음 또 다른 유용한 설명 : http://htipe.wordpress.com/2008/10/09/the-dp0-variable/

% ~ dp0 변수

받는 사람 확장하는 Windows 배치 파일 내에서 참조 할 때 %는 ~ DP0 변수 (즉, 제로의) D 리베 문자와 P는 그 배치 파일의 ATH.

변수 % 0- % 9는 배치 파일의 명령 줄 매개 변수를 나타냅니다. % 1- % 9는 배치 파일 이름 뒤의 명령 줄 인수를 나타냅니다. % 0은 (는) 배치 파일 자체를 나타냅니다.

물결표 문자 (~)로 퍼센트 문자 (%)를 따르는 경우 변수가 확장되는 방식을 변경하기 위해 매개 변수 번호 앞에 수정자를 삽입 할 수 있습니다. d 수정자는 드라이브 문자로 확장되고 p 수정자는 매개 변수의 경로로 확장됩니다.

예 : C :에 bat_files라는 디렉토리가 있고 그 디렉토리에 example.bat라는 파일이 있다고 가정하십시오. 이 경우 % ~ dp0 (d와 p 수정자를 결합한)은 C : \ bat_files로 확장됩니다.

자세한 설명은 이 Microsoft 기사 를 확인하십시오 .

또한 이 포럼 스레드를 확인하십시오 .

그리고 여기 에서보다 명확한 참조 :

  • %CmdCmdLine% CMD.EXE에 전달 된 전체 명령 줄을 반환합니다

  • %* 첫 번째 명령 줄 인수에서 시작하여 나머지 명령 줄을 반환합니다 (Windows NT 4의 경우 % *에는 모든 선행 공백이 포함됨)

  • %~dn % n이 유효한 경로 또는 파일 이름 (UNC 없음) 인 경우 드라이브 문자 % n (n은 0에서 9 사이의 범위)을 반환

  • %~pn % n이 유효한 경로 또는 파일 이름 인 경우 % n의 디렉토리를 반환합니다 (UNC 없음)

  • %~nn % n이 유효한 파일 이름 인 경우 % n의 파일 이름 만 반환합니다.

  • %~xn % n이 유효한 파일 이름 인 경우 % n의 파일 확장자 만 반환합니다.

  • %~fn % n이 유효한 파일 이름 또는 디렉토리 인 경우 % n의 완전한 경로를 리턴합니다.

추가 1

신비한 ~ 물결표 연산자에 대한 좋은 참고 자료를 찾았습니다 .

%~문자열을 퍼센트 물결표 연산자 라고 합니다. 다음과 같은 상황에서 찾을 수 있습니다 %~0.

:~문자열을 콜론 틸드 연산자 라고 합니다. 당신은 그것을 찾을 수 있습니다 %SOME_VAR:~0,-1%.

추가 2-1:12 오후 7/6/2018

%1-%9명령 행 인수를 참조하십시오. 유효한 경로 값 이 아닌 경우 %~dp1- %~dp9는 모두 같은 값으로 확장됩니다 %~dp0. 그들이하지만 있는 유효한 경로 값은, 그들로 확장됩니다 자신의 드라이버 / 경로 값.

예를 들면 다음과 같습니다. (batch.bat)

@echo off
@echo ~dp0= %~dp0
@echo ~dp1= %~dp1
@echo ~dp2= %~dp2
@echo on

실행 1 :

D:\Workbench>batch arg1 arg2

~dp0= D:\Workbench\
~dp1= D:\Workbench\
~dp2= D:\Workbench\

실행 2 :

D:\Workbench>batch c:\123\a.exe e:\abc\b.exe

~dp0= D:\Workbench\
~dp1= c:\123\
~dp2= e:\abc\

또한이 개념에 대해 궁금하고 여기에서 좋은 설명을 발견했습니다. 고마워요 Mingge. ^ _ ^
유진

1
나를 위해 c : \ bat_files \ (후행 경로 구분 기호 포함)로 확장
산타

Microsoft 기사 및 포럼 스레드에 대한 링크가 더 이상 작동하지 않습니다. (
wovano

150

%0배치 스크립트 의 변수 는 실행중인 배치 파일의 이름으로 설정됩니다.

~dp사이 의 특수 구문 %0기본적으로 변수를 확장 %0하여 드라이브 문자와 경로를 표시하므로 배치 파일이 들어있는 현재 디렉토리를 제공합니다!

도움말 = 링크


@Andy, %0.bat 파일을 로컬 하드 드라이브에 저장하지 않고 cmd에서 직접 테스트하는 방법이 있습니까?
Pacerier

링크가 깨져서 올바른 링크를 찾을 수 없습니다. 보류중인 수정 사항에 여전히 링크가 끊어졌습니다.
George_E

44

% ~ dp0은 실행중인 배치 파일의 현재 디렉토리 경로로 확장됩니다.

명확한 이해를 위해 디렉토리에 배치 파일을 만들어 봅시다.

C : \ script \ test.bat

내용과 함께 :

@echo off
echo %~dp0

명령 프롬프트에서 실행하면 다음과 같은 결과가 나타납니다.

C : \ 스크립트 \


40

많은 도움이되는 또 다른 팁은 현재 디렉토리를 다른 드라이브 로 설정하여 %~d0먼저 사용해야하는 것 cd %~dp0입니다. 그러면 디렉토리가 배치 파일의 드라이브로 변경된 다음 해당 폴더로 변경됩니다.

또는 #oneLinerLovers의 경우 @Omni가 주석에서 지적한 것처럼 cd /d %~dp0드라이브와 디렉토리를 모두 변경합니다 :)

이것이 누군가를 돕기를 바랍니다.


22
cd매개 변수가 내장되어 드라이브와 폴더를 모두 전환 할 것 :cd /d %~dp0
OmnipotentEntity

2
당신이 바로이며, /d인수는 도움이되지만 그것은으로 게시 될 자격이 후보 대안 대답 하고 하지 댓글 이 하나. 주셔서 감사합니다 하지만이 지적, 나는 :) 그것에 대해 알지 못했다
마빈 Thobejane에게

4
''pushd % ~ dp0 ''를 사용하여 드라이브와 폴더를 전환 할 수도 있습니다
fmuecke

25

Strawberry Perl의 휴대용 쉘 발사기의 좋은 예 :

set drive=%~dp0
set drivep=%drive%
if #%drive:~-1%# == #\# set drivep=%drive:~0,-1%

set PATH=%drivep%\perl\site\bin;%drivep%\perl\bin;%drivep%\c\bin;%PATH%

부정적인 1이 자신이 무엇을하고 있는지 확실하지 않지만 대접을합니다!


11
+1 매우 유용합니다. if 문은 백 슬래시가 있는지 확인하고 필요한 경우 백 슬래시를 제거합니다. 조건에서 음수 1은 마지막 문자를 추출하고 set 문의 표현식은 경로 문자열에서 마지막 문자 (백 슬래시)를 뺀 경로를 사용합니다.
Matt

1
음수 1은 마지막 문자를 뺀 것입니다. 변수 부분 문자열
phuclv

12

예가 좋을 것입니다-여기에 사소한 것이 있습니다.

for %I in (*.*) do @echo %~xI

현재 폴더에있는 각 파일의 확장자 만 나열합니다.

CMD 프롬프트에서 더 유용한 변수 조합 (이전 응답에도 나열 됨)을 실행하려면 HELP FOR 이 코드 조각이 포함되어 있습니다.

수정자를 결합하여 복합 결과를 얻을 수 있습니다.

%~dpI       - expands %I to a drive letter and path only
%~nxI       - expands %I to a file name and extension only
%~fsI       - expands %I to a full path name with short names only
%~dp$PATH:I - searches the directories listed in the PATH
               environment variable for %I and expands to the
               drive letter and path of the first one found.
%~ftzaI     - expands %I to a DIR like output line

"~ x 현재로서는 예상치 못한 결과를 얻었습니다." 예제를 시험해보십시오-Win 7을 사용하고 있기 때문입니까?
chapter 3

이것은 좋은 정보이지만 원래 게시물을 처리하지 못합니다.
De Shan Baptiste
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.