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

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

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

128745 次浏览

是的。

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

编写 %~n0来获得没有扩展名的文件名。

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

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

使用下面的脚本,根据 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”之间放置的位置。随你挑

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”

请记住,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给出的文件名是它在命令-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