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


120

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

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


1
%0是您要寻找的。有关更多信息,请参见[此问题] [1]。[1]:stackoverflow.com/questions/357315/...
乔纳森莱因哈特

2
是的,这就是我想要的。%〜nx0是答案。
djangofan 2012年

Answers:


159

是。

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

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

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

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


1
这只是不准确的。%0和%〜n0都只获得文件名部分。@djangofan的答案是正确的。
JustJeff

5
%0返回文件的调用方式。如果使用了完整路径,%0将具有该路径。如果您cd首先进入dir并从那里执行批处理,那么%0通常将没有路径信息(但是在这种情况下,您可以从%cd%获得该信息)
Gogowitsch 2015年

@gogowitsch:确定吗?我认为那不是真的。
Slaks 2015年

在Win2012上,%cd%将返回调用批处理文件的进程的当前目录。因此,如果您在提示时D:\dir1输入Y:\foo\bar.bat,如果bar.bat@echo %cd%则将输出D:\dir1
传道者

48

您可以获取文件名,但也可以获取完整路径,具体取决于放置在'%〜'和'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”


3
在代码块中,您声明的f是文件名,但在示例中,您将其n用作文件名。经过一些测试,似乎这f是完整路径,并且n是文件名。
德鲁·查平

@druciferre,我根据您的评论编辑了答案
robotik

“如果你变得可爱,然后尝试%~xnpd0”……我爱你。
Mark Deven

32

使用以下脚本,根据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将不起作用,因为我们知道通常使用' 〜'char来去除 /修剪变量的引号。


9

请记住,这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

3

尝试运行以下示例,以了解神奇变量的工作方式。

@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

0

下面是我的初始代码:

@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个字符开始,然后显示show接下来的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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.