답변:
폴더 이름 및 드라이브의 경우 다음을 사용할 수 있습니다.
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
cd /d "%~dp0"
( stackoverflow.com/questions/4451668에서 )
허용되는 답변은 도움이되지만 전달 된 값을 사용하지 않는 경우 경로에서 파일 이름을 검색하는 방법은 즉시 명확하지 않습니다. 나는이 스레드에서 이것을 해결할 수 있었지만 다른 사람들이 그렇게 운이 좋지 않은 경우 다음과 같이 수행됩니다.
@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
함수는 인수로 전달 된 것이 아니라 값을 검색하는 데 어디서나 사용할 수 있습니다. 인수가 불확실한 순서로 파일에 전달되거나 경로가 파일에 전혀 전달되지 않는 경우 매우 유용합니다.
%~dp1
드라이브 만 경로.
"
s 를 추가해야 !myPath!
합니다 (또는 따옴표가 myPath의 일부가 됨)
누구든지 다른 방법을 원한다면 ...
경로의 마지막 하위 디렉토리 인 경우이 단일 라이너를 사용할 수 있습니다.
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 \ ..는 단순히 상위 폴더를 반환합니다.
도움이되기를 바랍니다.
이것은 편집 된 예제 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