首页 > 解决方案 > 如何在 Windows 10 上的批处理块中使用 ~dp0

问题描述

这对我来说似乎是一个错误......
我正在寻找一个解释或一个漂亮的解决方法......

当脚本位于以右括号结尾的部分()如 中)时Program Files(x86),脚本似乎“吃掉”了右括号。
不会在 Windows 7 上发生,只是在 Windows 10 上发生......

@echo off
echo %%~dp0 outside the code block = %~dp0
if 0 EQU 0 (
    echo %%~dp0  inside the code block = %~dp0
)

您可以使用位于以下位置的脚本进行尝试:

 - C:\Program Files (x86)\
 - C:\Program Files (x86)\Some Folder\
 - C:\Program Files (x86)\Some Folder\Another one\
 - C:\test-ok\test-not-ok-(1)\

标签: batch-fileif-statementwindows-10

解决方案


发生这种情况是因为立即%展开发生在括号等特殊字符被识别之前。

为了防止你可以引用字符串,所以特殊字符受到保护:

@echo off
echo %%~dp0 outside the code block = "%~dp0"
if 0 EQU 0 (
    echo %%~dp0  inside the code block = "%~dp0"
)

当然,引号可能会打扰。但是您可以使用延迟扩展来回显未引用的路径:

@echo off
set "string=%~dp0"
setlocal EnableDelayedExpansion
echo %%~dp0 outside the code block = !string!
if 0 EQU 0 (
    echo %%~dp0  inside the code block = !string!
)
endlocal

或者,您可以在特殊字符识别后使用for循环来实现另一个扩展阶段:

@echo off
for %%I in ("%~dp0") do (
    echo %%~dp0 outside the code block = %%~I
    if 0 EQU 0 (
        echo %%~dp0  inside the code block = %%~I
    )
)

推荐阅读