CMD를 사용하여 파일 경로에서 폴더 경로를 얻는 방법


151

cmd 파일이 들어있는 폴더의 경로가 필요합니다. % 0으로 파일 이름을 얻을 수 있습니다. 그러나 폴더 이름을 얻는 방법?

c : \ temp \ test.cmd >> test.cmd

PS 내 현재 디렉토리! = 스크립트의 폴더.

답변:


310

폴더 이름 및 드라이브의 경우 다음을 사용할 수 있습니다.

echo %~dp0

다른 수정자를 사용하여 더 많은 정보를 얻을 수 있습니다.

%~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

The modifiers can be combined to get compound results:
%~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

이것은 "for /?"의 복사 붙여 넣기입니다. 프롬프트에서 명령. 도움이 되길 바랍니다.

관련

상위 10 개 DOS 배치 팁 (예, DOS 배치 ...)batchparams.bat (요점으로 소스 링크 )를 보여줍니다 .

C:\Temp>batchparams.bat c:\windows\notepad.exe
%~1     =      c:\windows\notepad.exe
%~f1     =      c:\WINDOWS\NOTEPAD.EXE
%~d1     =      c:
%~p1     =      \WINDOWS\
%~n1     =      NOTEPAD
%~x1     =      .EXE
%~s1     =      c:\WINDOWS\NOTEPAD.EXE
%~a1     =      --a------
%~t1     =      08/25/2005 01:50 AM
%~z1     =      17920
%~$PATHATH:1     =
%~dp1     =      c:\WINDOWS\
%~nx1     =      NOTEPAD.EXE
%~dp$PATH:1     =      c:\WINDOWS\
%~ftza1     =      --a------ 08/25/2005 01:50 AM 17920 c:\WINDOWS\NOTEPAD.EXE

멋있는. 다른 사람의 위키 게시물을 수정하려면 특정 점수가 필요합니까?
Wadih M.

@Wadih M .: 일반적으로 유용한 링크 stackoverflow.com/questions/18557/…
jfs


@Wadih M .: 위 링크에서 : "커뮤니티 'wiki 편집 가능'게시물을 편집하려면 +750"
jfs

따라서 cmd 스크립트가 작업 디렉토리를 스크립트 위치로 설정하려면 cd /d "%~dp0"( stackoverflow.com/questions/4451668에서 )
Nigel Touch

52

허용되는 답변은 도움이되지만 전달 된 값을 사용하지 않는 경우 경로에서 파일 이름을 검색하는 방법은 즉시 명확하지 않습니다. 나는이 스레드에서 이것을 해결할 수 있었지만 다른 사람들이 그렇게 운이 좋지 않은 경우 다음과 같이 수행됩니다.

@echo off
setlocal enabledelayedexpansion enableextensions

set myPath=C:\Somewhere\Somewhere\SomeFile.txt
call :file_name_from_path result !myPath!
echo %result%
goto :eof

:file_name_from_path <resultVar> <pathVar>
(
    set "%~1=%~nx2"
    exit /b
)

:eof
endlocal

이제 :file_name_from_path함수는 인수로 전달 된 것이 아니라 값을 검색하는 데 어디서나 사용할 수 있습니다. 인수가 불확실한 순서로 파일에 전달되거나 경로가 파일에 전혀 전달되지 않는 경우 매우 유용합니다.


와우, 정말 대단해! 따라서 Windows 배치 파일은 동일한 파일 내에서 기능을 지원하므로 유용합니다! 언제부터 가능 했습니까?
누가

2
참조 (있는 그대로)와 값 ( "!"으로 둘러싸인)으로 변수를 전달할 수 있기를 바랍니다. 좋아, 아마도 "로컬"변수와 호출 스택이 없을 것입니다 ...하지만 이봐 : 그것은 결국 cmd 스크립트입니다. 어쨌든 큰 발전입니다. 여러 파일로 나누는 것보다 :)
Luke

1
나는 "goto : eof"가 "goto eof"여야한다고 생각한다.
Khudairy

2
참조 : ss64.com/nt/syntax-args.html - 사용 %~dp1드라이브 만 경로.
Andrew

2
@AKhudairy가 정확합니다. ss64.com/nt/goto.html 콜론을 사용하면 goto가 endlocal을 건너 뜁니다. 또한 경로에 공백이 있으면 "s 를 추가해야 !myPath!합니다 (또는 따옴표가 myPath의 일부가 됨)
Rick

8

변수에 변수를 할당하려면 등호 앞에 또는 뒤에 공백을 추가하지 마십시오.

set filepath=%~dp1
set filename=%~nx1

그러면 문제가 없어야합니다.


5

누구든지 다른 방법을 원한다면 ...

경로의 마지막 하위 디렉토리 인 경우이 단일 라이너를 사용할 수 있습니다.

cd "c:\directory\subdirectory\filename.exe\..\.." && dir /ad /b /s

이것은 다음을 반환합니다.

c:\directory\subdirectory

....은 이전 디렉토리로 돌아갑니다. / ad는 디렉토리 만 표시합니다. / b는 기본 형식입니다. / s는 모든 하위 디렉토리를 포함합니다. 인쇄 할 디렉토리의 전체 경로를 가져 오는 데 사용됩니다.


스크립트 파일이있는 디렉토리가 아닌 현재 디렉토리에 대해 작동합니다.
Mike Chaliy

4

루프에서 동일한 디렉토리에서 zip 파일을 추출한 다음 zip 파일을 삭제하려는 동일한 문제가 발생했습니다. 문제는 7z에 출력 폴더가 필요하다는 것이므로 각 파일의 폴더 경로를 얻어야했습니다. 내 해결책은 다음과 같습니다.

FOR /F "usebackq tokens=1" %%i IN (`DIR /S/B *.zip` ) DO (
  7z.exe x %%i -aoa -o%%i\..
) 

%% i는 전체 파일 이름 경로이며 % ii \ ..는 단순히 상위 폴더를 반환합니다.

도움이되기를 바랍니다.


빠르고 더러운. 나는 그것을 좋아한다! "\ .."로 파일 경로를 콜드 확장하고 상위 폴더로 끝내지 않았다고 생각하지 마십시오.
Oliver R.

이것은 Win10에서 나를 위해 일했습니다 : FOR / R "C : \ sourceDir"% I IN (* .gz) DO C : \ 7-Zip64 \ 7z.exe x "% I"-aou -o % I \ .. \
b3wii

예! 이것은 % ~ dp1 (등)이 % 0, % 1, % 2 등에서 만 작동한다는 문제를 해결합니다.
Artelius

3

Wadih가 수락 한 답변이 효과가없는 경우 시도해보십시오. echo %CD%


0

이것은 편집 된 예제 cmd와 함께 정리되었습니다.

@Echo off

Echo ********************************************************
Echo *  ZIP Folder Backup using 7Zip                        *
Echo *  Usage: Source Folder, Destination Drive Letter      *
Echo *  Source Folder will be Zipped to Destination\Backups *
Echo ********************************************************
Echo off

set year=%date:~-4,4%
set month=%date:~-10,2%
set day=%date:~-7,2%
set hour=%time:~-11,2%
set hour=%hour: =0%
set min=%time:~-8,2%

SET /P src=Source Folder to Backup: 
SET source=%src%\*
call :file_name_from_path nam %src%
SET /P destination=Backup Drive Letter:
set zipfilename=%nam%.%year%.%month%.%day%.%hour%%min%.zip
set dest="%destination%:\Backups\%zipfilename%"


set AppExePath="%ProgramFiles(x86)%\7-Zip\7z.exe"
if not exist %AppExePath% set AppExePath="%ProgramFiles%\7-Zip\7z.exe"

if not exist %AppExePath% goto notInstalled

echo Backing up %source% to %dest%

%AppExePath% a -r -tzip %dest% %source%

echo %source% backed up to %dest% is complete!

TIMEOUT 5

exit;

:file_name_from_path <resultVar> <pathVar>
(
    set "%~1=%~nx2"
    exit /b
)


:notInstalled

echo Can not find 7-Zip, please install it from:
echo  http://7-zip.org/

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