Как использовать ~ dp0 в пакетном блоке на Windows 10 - PullRequest
1 голос
/ 25 января 2020

Мне это кажется ошибкой ...
Я ищу объяснение или довольно обходной путь ...

Когда сценарий находится с деталью, заканчивающейся закрывающей скобкой ) как и в 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)\

1 Ответ

4 голосов
/ 25 января 2020

Это происходит потому, что немедленное расширение % происходит до того, как специальные символы, такие как круглые скобки, будут распознаны.

Чтобы предотвратить ввод строки в кавычки, специальные символы защищены:

@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 l oop для достижения другой фазы расширения после распознавания специальных символов:

@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
    )
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...