提问人:hippo 提问时间:7/24/2021 最后编辑:Compohippo 更新时间:8/15/2021 访问量:133
如何获取批处理文件 [duplicate] 的路径
How do I get the path of a batch-file [duplicate]
问:
默认答案为 %~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% 中的批处理文件,而无需指定完整路径。而且我的批次还需要知道它的位置。 所以。。。。这是我找到的非常简单的解决方法:
保存在 “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”。
对此有何评论?是错误还是功能?
答: 暂无答案
评论