Windows 배치 파일이 자체 파일 이름을 결정할 수 있습니까?
예를 들어 배치 파일 C : \ Temp \ myScript.bat를 실행하는 경우 myScript.bat 내에 “myScript.bat”문자열을 확인할 수있는 명령이 있습니까?
답변
예.
특수 %0
변수를 사용하여 현재 파일의 경로를 가져옵니다.
%~n0
확장자없이 파일 이름 만 얻으려면 작성 하십시오.
%~n0%~x0
파일 이름과 확장자를 얻으려면 작성 하십시오.
%~nx0
파일 이름과 확장자를 얻기 위해 쓸 수도 있습니다.
답변
파일 이름을 얻을 수 있지만 ‘% ~’와 ‘0’사이에 배치하는 내용에 따라 전체 경로를 얻을 수도 있습니다. 선택하세요
d -- drive
p -- path
n -- file name
x -- extension
f -- full path
예를 들어, c : \ tmp \ foo.bat 내부에서 %~nx0
“foo.bat”를 %~dpnx0
제공하고 “c : \ tmp \ foo.bat”를 제공합니다. 당신이 귀여운 얻을 그렇다면, 조각은 항상 정규 순서로 조립 참고하려고 %~xnpd0
, 당신은 여전히 “: \ TMP \ foo.bat c”를 얻을
답변
SLaks 답변을 기반으로 다음 스크립트를 사용하여 정답이 다음과 같음을 확인했습니다.
echo The name of this file is: %~n0%~x0
echo The name of this file is: %~nx0
그리고 여기 내 테스트 스크립트가 있습니다.
@echo off
echo %0
echo %~0
echo %n0
echo %x0
echo %~n0
echo %dp0
echo %~dp0
pause
흥미로운 점은 ‘~’문자가 일반적으로 변수에서 따옴표를 제거 / 자르는 데 사용된다는 점을 감안할 때 % nx0 이 작동하지 않는다는 것입니다.
답변
0
배치 파일 내 매개 변수 번호의 특수한 경우 라는 점을 명심하십시오 . 여기서이 파일 은 명령 줄에 지정된대로0
의미 합니다 .
따라서 파일이 myfile.bat 인 경우 다음과 같이 여러 가지 방법으로 호출 할 수 있습니다. 각 방법 은 또는 사용법과 다른 출력을 제공합니다 .%0
%~0
myfile
myfile.bat
mydir\myfile.bat
c:\mydir\myfile.bat
"c:\mydir\myfile.bat"
위의 모든 것은 올바른 상대 위치에서 그것이 존재하는 디렉토리로 호출하는 경우 합법적 인 호출입니다. %~0
마지막 예에서 인용 부호를 제거하는 반면%0
그렇지 않습니다.
이것들은 모두 다른 결과를 제공 %0
하고 %~0
실제로 사용하고 싶은 것 같지 않기 때문입니다.
설명 할 배치 파일은 다음과 같습니다.
@echo Full path and filename: %~f0
@echo Drive: %~d0
@echo Path: %~p0
@echo Drive and path: %~dp0
@echo Filename without extension: %~n0
@echo Filename with extension: %~nx0
@echo Extension: %~x0
@echo Filename as given on command line: %0
@echo Filename as given on command line minus quotes: %~0
@REM Build from parts
@SETLOCAL
@SET drv=%~d0
@SET pth=%~p0
@SET fpath=%~dp0
@SET fname=%~n0
@SET ext=%~x0
@echo Simply Constructed name: %fpath%%fname%%ext%
@echo Fully Constructed name: %drv%%pth%%fname%%ext%
@ENDLOCAL
pause
답변
마법의 변수가 어떻게 작동하는지 느끼기 위해 아래 예제를 실행 해보십시오.
@echo off
SETLOCAL EnableDelayedExpansion
echo Full path and filename: %~f0
echo Drive: %~d0
echo Path: %~p0
echo Drive and path: %~dp0
echo Filename without extension: %~n0
echo Filename with extension: %~nx0
echo Extension: %~x0
echo date time : %~t0
echo file size: %~z0
ENDLOCAL
관련 규칙은 다음과 같습니다.
%~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
답변
아래는 내 초기 코드입니다.
@echo off
Set z=%%
echo.
echo %z%0.......%0
echo %z%~0......%~0
echo %z%n0......%n0
echo %z%x0......%x0
echo %z%~n0.....%~n0
echo %z%dp0.....%dp0
echo %z%~dp0....%~dp0
echo.
% ~ 0 및 % 0으로 지정된 파일 이름이 명령 셸에 입력 된 방식이며 해당 파일의 실제 이름이 지정되는 방식이 아니라는 것을 알았습니다. 따라서 파일 이름에 리터럴 대소 문자를 사용하려면 % ~ n0을 사용해야합니다. 그러나 이것은 파일 확장자를 생략합니다. 그러나 파일 이름을 알고 있다면 다음 코드를 추가 할 수 있습니다.
set b=%~0
echo %~n0%b:~8,4%
“: ~ 8,4 %”는 변수의 9 번째 문자에서 시작하여 다음 4 개 문자를 표시하는 것을 의미합니다. 범위는 0에서 변수 문자열의 끝까지입니다. 따라서 % Path %는 매우 길 것입니다!
fIlEnAmE.bat
012345678901
그러나 이것은 위의 Jool의 솔루션 (% ~ x0)만큼 소리가 나지 않습니다.
내 증거 :
C:\bin>filename.bat
%0.......filename.bat
%~0......filename.bat
. . .
C:\bin>fIlEnAmE.bat
%0.......fIlEnAmE.bat
%~0......fIlEnAmE.bat
%n0......n0
%x0......x0
%~n0.....FileName
%dp0.....dp0
%~dp0....C:\bin\
%~n0%b:~8,4%...FileName.bat
Press any key to continue . . .
C:\bin>dir
Volume in drive C has no label.
Volume Serial Number is CE18-5BD0
Directory of C:\bin
. . .
05/02/2018 11:22 PM 208 FileName.bat
다음은 최종 코드입니다.
@echo off
Set z=%%
set b=%~0
echo.
echo %z%0.......%0
echo %z%~0......%~0
echo %z%n0......%n0
echo %z%x0......%x0
echo %z%~n0.....%~n0
echo %z%dp0.....%dp0
echo %z%~dp0....%~dp0
echo.
echo A complex solution:
echo ===================================
echo %z%~n0%z%b:~8,4%z%...%~n0%b:~8,4%
echo ===================================
echo.
echo The preferred solution:
echo ===================================
echo %z%~n0%z%~x0.......%~n0%~x0
echo ===================================
pause