windows - 如何获取批处理文件的路径
问题描述
默认答案是 %~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”。
对此有何评论?它是错误还是功能?
解决方案
推荐阅读
- mysql - MySQL查询以检查日期间隔的一部分是否包含在另一个日期间隔内
- sockets - 存在连接不稳定时套接字的行为方式
- python - 在 Windows 和 Linux 上安装 pdf 阅读器 - Chef
- spring-boot - 通过 application.yml 外部化 Hystrix 配置
- python - 具有上下文管理器和属性的 Python 多处理管理器
- mysql - MySQL停止和套接字文件消失
- java - Payara 5.183 上的 MicroProfile JWT Auth 1.1 注入的 JsonWebToken 为空
- c# - 如何在没有用户交互的情况下从 db 获取最近更新的数据
- javascript - 未捕获的 RangeError:超出最大调用堆栈大小 - ReactJS
- impex - 错误 [main] (00000021-ImpEx-Import) [ImpExImportJob] 无法解析更多行...正在中止进一步传递