programing

Windows 배치파일은 자신의 파일명을 결정할 수 있습니까?

newnotes 2023. 4. 10. 22:12
반응형

Windows 배치파일은 자신의 파일명을 결정할 수 있습니까?

Windows 배치파일은 자신의 파일명을 결정할 수 있습니까?

예를 들어 배치 파일 C를 실행하는 경우:\Temp\myScript.bat, "myScript.bat" 문자열을 판별할 수 있는 명령어가 myScript.bat 내에 있습니까?

네.

스페셜을 이용%0variable을 지정하여 현재 파일의 경로를 가져옵니다.

기입하다%~n0확장자 없이 파일 이름만 가져옵니다.

기입하다%~n0%~x0파일명과 확장자를 가져옵니다.

기입도 가능%~nx0파일명과 확장자를 가져옵니다.

파일명을 취득할 수 있지만, 「%~」와 「0」의 사이에 배치하는 항목에 따라서, 풀 패스를 취득할 수도 있습니다.원하는 것을 고르세요.

d -- drive
p -- path
n -- file name
x -- extension
f -- full path

예: c:\tmp\foo.bat 내부에서%~nx0"foo.bat"을 제공하지만%~dpnx0c:\tmp\foo.bat을 지정합니다.이 조각들은 항상 정석순으로 조립되어 있기 때문에, 만약 여러분이 귀엽게 굴어서%~xnpd0그래도 "c:\tmp\foo.bat"은 표시됩니다.

다음 스크립트를 사용하여 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

언급URL : https://stackoverflow.com/questions/8797983/can-a-windows-batch-file-determine-its-own-file-name

반응형