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

dja*_*fan 98 windows cmd batch-file

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

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

SLa*_*aks 136

是.

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

写入%~n0只获取没有扩展名的文件名.

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

也可以写入%~nx0以获取文件名和扩展名.

  • %0返回调用文件的方式.如果使用完整路径,则%0将具有该路径.如果你首先"cd"进入dir并从那里执行批处理,%0通常没有路径信息(但在这种情况下你可以从%cd%获得) (5认同)
  • 这是不准确的。%0 和 %~n0 都只得到文件名部分。@djangofan 的回答是正确的。 (2认同)

Jus*_*eff 38

您可以获取文件名,但也可以获取完整路径,具体取决于您在'%〜'和'0'之间的位置.从中挑选

d -- drive
p -- path
n -- file name
x -- extension
f -- full path
Run Code Online (Sandbox Code Playgroud)

例如,从c:\ tmp\foo.bat里面,%~nx0给你"foo.bat",同时%~dpnx0给出"c:\ tmp\foo.bat".请注意,这些部分总是按照规范顺序组装,所以如果你变得可爱并尝试%~xnpd0,你仍然会得到"c:\ tmp\foo.bat"

  • 在您的代码块中,您声明`f`是文件名,但在您的示例中,您使用`n`作为文件名.经过一些测试,似乎`f`是完整路径,`n`是文件名. (3认同)

dja*_*fan 30

使用以下脚本,基于SLaks答案,我确定正确的答案是:

echo The name of this file is: %~n0%~x0
echo The name of this file is: %~nx0
Run Code Online (Sandbox Code Playgroud)

这是我的测试脚本:

@echo off
echo %0
echo %~0
echo %n0
echo %x0
echo %~n0
echo %dp0
echo %~dp0
pause
Run Code Online (Sandbox Code Playgroud)

我觉得有趣的是%nx0不起作用,因为我们知道' 〜'char通常用于从变量中去除/修剪引号.


Joo*_*ool 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
Run Code Online (Sandbox Code Playgroud)