현재 배치 파일 디렉토리 가져 오기


283

첫째, 나는 이 주제를 보았지만 이해할 수 없었습니다.

질문 :

D:\path\to\file.bat다음 내용으로 된 배치 파일이 있습니다.

echo %cd%
pause

출력 :

C:\

반드시 있어야합니다 D:\path\to

내가 뭘 잘못하고 있죠?


7
당신은 질문에 대한 모든 답변, 특히 받아 들여진 질문뿐만 아니라 더 높은 투표권을 받아야합니다. 게시 된 링크에서 가장 높은 점수를받은 답변이 이미 귀하의 질문에 답변합니다.
dbenham 2016 년

4
배치 파일 이름을 입력 할 때 c : \에 있으면 c : \는 % cd %가 인쇄하는 것입니다.
foxidrive 2016 년

답변:


496

시스템 읽기 전용 변수 %CD%는 배치 파일 위치가 아니라 배치 호출자의 경로를 유지합니다.

%0(예 :)를 사용하여 사용자가 입력 한 배치 스크립트 자체의 이름을 얻을 수 있습니다 scripts\mybatch.bat. 매개 변수 확장 이 너무에 적용 할 수있는 %~dp0배치 스크립트 (예에 드라이브 및 경로를 반환 W:\scripts\) 및 %~f0전체 경로 이름 (예를 반환합니다 W:\scripts\mybatch.cmd).

이 구문을 사용하여 배치 스크립트와 동일한 폴더에있는 다른 파일을 참조 할 수 있습니다.

CALL %0\..\SecondBatch.cmd

서브 루틴에서도 사용할 Echo %0수 있으며 호출 레이블을 제공하지만 echo "%~nx0"배치 스크립트의 파일 이름을 제공합니다.

%0변수가 팽창 결과는 인용 부호된다.

배치 파라미터에 대한 추가 정보 .


1
봐는, 내가 실행할 필요가 없습니다 stm.sql에서 D:\Dir1\Dir2\stm.sql. mysql.exe -u root -p mysql < %cd%\stm.sqlstm.sql 명령을 실행 해야 합니다.
Hamed Kamrava

@HamedKamrava는 내 SQL 배치입니까? *.bat또는 같은 배치 파일이 아니 *.sh십니까?
Stoleg

@ Stoleg-에서 사실, 거기에이 개 파일은 D:\Dir1\Dir2\batchfile.batD:\Dir1\Dir2\stm.sql. batchfile.bat 내용은 : mysql.exe -u root -p mysql < D:\Dir1\Dir2\stm.sql이고 stm.sql 내용은 일부 MySQL 명령입니다.
Hamed Kamrava

1
시스템 읽기 전용 변수 % CD %는 배치 파일 위치가 아니라 배치 호출자의 경로를 유지합니다.
Stoleg

34
echo %~dp0배치 위치로 경로를 반환합니다. echo %~f0파일 이름으로 배치 경로를 반환합니다.
Stoleg

119

매우 간단합니다 :

setlocal
cd /d %~dp0
File.exe

9
코드는 짧지 만 이해하기 쉽지 않습니다. 이 File.exe는 무엇입니까? 현재 디렉토리 경로가 % ~ dp0에 저장되어 있습니까?
Ivailo Bardarov

이 답변은 실제로 질문에 대답합니다. 명성.
macetw

3
방금 cd /d %~dp0배치 파일의 첫 줄로 사용 하고 작동했습니다
mkb

왜 setlocal이 필요합니까? 그것 없이도 잘 돌아옵니다?
T.Todua

1
@ T.Todua "setlocal"은 배치 파일이 종료되거나 "endlocal"이 발견 될 때까지 현재 디렉토리를 포함하여 환경이 변경되도록합니다. 환경 변수 또는 현재 디렉토리를 변경하려는 경우 좋은 형식입니다.
Jamie

30

.bat 파일 내에서 :

set mypath=%cd%

이제 변수 %mypath%를 사용하여 파일의 파일 경로를 참조 할 수 있습니다 .bat. 경로가 올바른지 확인하려면 다음을 수행하십시오.

@echo %mypath%

예를 들어 DIR.bat다음 내용으로 호출 된 파일

set mypath=%cd%
@echo %mypath%
Pause

디렉토리에서 실행 g:\test\bat하면 DOS 명령 창에서 해당 경로가 에코됩니다.


1
이것은 가장 훌륭하고 간단한 해결책입니다
Nani

7
다른 경로의 다른 파일에서 호출되는 배치 스크립트를 고려하지 않기 때문에 이것은 좋은 해결책이 아닙니다.
theQuestionMan

또한 높은 권한으로 실행되면 % cd %는 C : \ Windows \ system32를 반환하지만 저장된 디렉터리는 반환하지 않습니다.
PravyNandas

9

다음은 모든 배치 파일 상단에서 사용하는 것입니다. 템플릿 폴더에서 복사 / 붙여 넣기 만하면됩니다.

@echo off
:: --HAS ENDING BACKSLASH
set batdir=%~dp0
:: --MISSING ENDING BACKSLASH
:: set batdir=%CD%
pushd "%batdir%"

현재 배치 파일의 경로를 % batdir %로 설정하면이 배치 파일이 변경되는 위치에 관계없이 현재 배치 파일의 후속 stmt에서이를 호출 할 수 있습니다. PUSHD를 사용하면 POPD를 사용하여이 배치 파일의 경로를 원래 % batdir %로 빠르게 설정할 수 있습니다. % batdir % ExtraDir 또는 % batdir % \ ExtraDir (위에서 사용 된 버전에 따라, 백 슬래시 종료 여부)을 사용하는 경우 경로에 공백이있는 경우 전체 문자열을 큰 따옴표로 묶어야합니다 (예 : "% batdir % ExtraDir" ). 항상 PUSHD % ~ dp0을 사용할 수 있습니다. [https : // ss64.com/ nt / syntax-args .html]에 더 많은 (% ~) 매개 변수가 있습니다.

줄의 시작 부분에 (: :)을 사용하면 주석 줄이됩니다. 더 중요한 것은 ::를 사용하면 해당 주석에 리디렉터, 파이프, 특수 문자 (예 : <> | 등)를 포함 할 수 있습니다.

:: ORIG STMT WAS: dir *.* | find /v "1917" > outfile.txt

물론 Powershell은이 작업과 그 밖의 작업을 수행합니다.


2
좋은 답변, 많이 감사합니다! :-) 두 번째 기술 ( set batdir=%CD%)을 조심하십시오 . 박쥐 파일 자체가 아닌 호출자의 경로이기 때문에 괜찮습니다. bat 파일을 실행하는 유일한 방법은 %~dp0입니다.
Mitch McMabers
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.