首页 > 解决方案 > 如何获取批处理文件的路径

问题描述

默认答案是 %~dp0。大多数时候这会很好。但是 cmd.exe 中有一个错误,如果您使用双引号调用批处理,它会阻止它在某些情况下正常工作。如果批处理文件的名称或路径包含空格,则必须使用双引号。因此,为方便起见,每个人都在所有文件名上添加双引号。

我与这个错误斗争了很长时间。

此示例将显示错误:创建此批处理文件,将其命名为“z z.cmd”并将其放在由 %path% 或 f.ex 指定的文件夹中。在 C:\Windows 中。

@echo off
echo.%~x0.
echo.%~dpnx0.
goto :eof

现在打开命令提示符(所以现在我们在 C:\Windows\System32 或 %HOMEPATH% 中,没关系)并通过键入“z z”(包括双引号)来调用批处理。这是输出:

.
C:\Windows\System32\z z.

如您所见,无法确定文件扩展名,并且显示的路径是调用批处理的位置,而不是批处理所在的位置。好的。现在我们将通过键入“z z.cmd”来调用批处理。这是输出:

.cmd.
C:\Windows\System32\z z.

现在文件扩展名是正确的(当然!),但路径仍然是错误的。好的。现在我们将批处理重命名为不带空格的名称,将其重命名为“z.cmd”。通过键入“z”(始终使用双引号)调用它这是输出:

.
C:\Windows\System32\z.

如您所见,即使名称没有空格,它仍然会显示错误的路径和未知的扩展名。那么究竟有什么作用呢?:-) 只有这种调用批处理的方法才能正常工作:

>z
>z.cmd
>"C:\Windows\z.cmd"

众所周知,最佳做法是始终为所有文件名添加双引号。所以我们会保留这个。但我也想调用位于 %path% 中的批处理文件,而无需指定完整路径。而且我的批次还需要知道它的位置。SO....这是我发现的非常简单的解决方法:

将其保存在“z z.cmd”中

@echo off
call :getself
goto :eof

:getself
echo.%~x0.
echo.%~dpnx0.
goto :eof

用“z z”调用它 -> 输出将是:

.cmd.
C:\Windows\z z.cmd.

应该是这样!无论您如何调用批处理,此解决方法都将始终有效。

所以我们了解到 cmd.exe 并不总是给出正确的文件信息。只有通过执行调用 cmd.exe 才会重新计算并给出正确的文件信息,如果它有双引号!

处理问题的另一种方法是 %~$path:0。它将显示正确的路径,但前提是您在调用批处理文件时添加 .cmd。因此,如果在命令提示符下只键入“z z”,它将不起作用。您必须输入“z z.cmd”。

对此有何评论?它是错误还是功能?

标签: windowsbatch-filecmdpathquotes

解决方案


推荐阅读