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

时间:2012-01-10 02:49:33

标签: windows batch-file cmd

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

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

5 个答案:

答案 0 :(得分:120)

是。

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

%~n0以获取没有扩展名的文件名。

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

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

答案 1 :(得分:34)

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

答案 2 :(得分:30)

使用以下脚本,基于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 不会起作用,因为我们知道'〜'字符通常用于从变量中去除/修剪引号。

答案 3 :(得分:8)

请记住0是批处理文件中参数编号的特例,其中0表示此文件在命令行中给出

因此,如果文件是myfile.bat,您可以通过以下几种方式调用它,每个方法都会为%0或{{1}提供不同的输出用法:

%~0

myfile

myfile.bat

mydir\myfile.bat

c:\mydir\myfile.bat

如果您从正确的相对位置调用它到它所在的目录,则以上所有都是合法调用。 "c:\mydir\myfile.bat"删除了上一个示例中的引号,而%~0则没有。

因为这些都会产生不同的结果,%0%0不太可能是你真正想要使用的。

这是一个批处理文件来说明:

%~0

答案 4 :(得分: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给出的文件名是在命令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