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

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

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

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



답변

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

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


답변

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

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


답변

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

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

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


답변

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

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

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

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

c:\directory\subdirectory

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


답변

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

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

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

도움이되기를 바랍니다.


답변

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


답변

이것은 편집 된 예제 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