Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 批脚本:什么';%0和%%f0之间的差异是多少?_Windows_Batch File_Cmd_Windows 10_Command Prompt - Fatal编程技术网

Windows 批脚本:什么';%0和%%f0之间的差异是多少?

Windows 批脚本:什么';%0和%%f0之间的差异是多少?,windows,batch-file,cmd,windows-10,command-prompt,Windows,Batch File,Cmd,Windows 10,Command Prompt,我有一个批处理脚本,我想在其中获得脚本的完整路径。我很好奇,这两者之间有什么区别吗: set scriptpath=%0 这是: set scriptpath=%~f0 感谢您的帮助。%~f0将%0扩展为完全限定的路径名。它们可能相等,也可能不相等,这取决于%0的原始值 这些修饰符的含义隐藏在命令的文档中。%0引用了参数0—批处理文件的名称—始终与命令行或其他批处理文件中的指定完全相同 因此,如果存储在C:\Temp中的名为Test.bat的批处理文件是从命令提示符窗口中启动的,当前目录为C

我有一个批处理脚本,我想在其中获得脚本的完整路径。我很好奇,这两者之间有什么区别吗:

set scriptpath=%0
这是:

set scriptpath=%~f0

感谢您的帮助。

%~f0
%0
扩展为完全限定的路径名。它们可能相等,也可能不相等,这取决于
%0
的原始值


这些修饰符的含义隐藏在命令的文档中。

%0
引用了参数0—批处理文件的名称—始终与命令行或其他批处理文件中的指定完全相同

因此,如果存储在
C:\Temp
中的名为
Test.bat
的批处理文件是从命令提示符窗口中启动的,当前目录为
C:\
with
Temp\Test
,则
%0
在引用时被
Temp\Test
替换

但是,
%~f0
几乎总是被具有文件扩展名和完整路径(完全限定文件名)的批处理文件名替换,并且总是不带双引号,即使文件名或路径包含1个或多个字符,如空格或
&()[]{}^=;!'+`~通常需要使用双引号

因此,批处理文件
Test.bat
存储在
C:\Temp

@echo %0
@echo %~f0
从命令提示符窗口中启动,使用
“temp\test.bat”
,当前目录为
C:\
输出:

"temp\test.bat"
C:\Temp\Test.bat
您可以在这里看到所有差异:

  • 完全限定的批处理文件名
  • 始终没有双引号和
  • 所有字母的大小写都正确
运行
CALL/?
时,可以通过命令CALL输出读取
%f0
和其他替换的说明,或在命令提示窗口中运行
FOR/?
并读取所有显示页面时,通过命令FOR读取说明

注1:

如果以后需要,在批处理文件中为环境变量指定完全限定的批处理文件名,并使用CDPUSHD从批处理文件中修改当前目录。有关原因,请参见上的答案

注2:

C:\
运行上面的示例批处理文件,只需使用
“temp\test”
即可生成输出:

"temp\test"
C:\Temp\Test
缺少文件扩展名,这是由第一个注释的参考主题中描述的错误引起的。使用不带双引号的
temp\test
启动批处理文件将生成预期输出:

temp\test
C:\Temp\Test.bat

或在运行时的帮助输出中隐藏较少的命令提示窗口中的命令调用
call/?
与运行时的帮助输出
for/?
相比,键入
for/?
并阅读,或单击