Windows批处理文件是否可以确定自己的文件名



Windows批处理文件是否可以确定自己的文件名?

例如,如果我运行批处理文件C:\Temp\myScript.bat,那么myScript.bat中是否有一个命令可以确定字符串"myScript.bat"?

是。

使用特殊的%0变量获取当前文件的路径。

编写%~n0,只获取不带扩展名的文件名。

编写%~n0%~x0以获取文件名和扩展名。

也可以写%~nx0来获得文件名和扩展名。

您可以获得文件名,但也可以获得完整路径,具体取决于您在"%~"one_answers"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,你仍然得到"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

mydirmyfile.bat

c:mydirmyfile.bat

"c:mydirmyfile.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给出的文件名是在命令shell中输入的方式,而不是该文件的实际命名方式。因此,如果您希望文件名使用大小写,则应使用%~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

最新更新