Пакетный скрипт, интерпретирующий содержимое внутри комментария? - PullRequest
0 голосов
/ 21 ноября 2018

Когда я запускаю следующий пакетный скрипт:

@echo off
REM %~ will strip surrounding quotes if any

echo HERE

я получаю следующую ошибку:

C:\>test.cmd
The following usage of the path operator in batch-parameter
substitution is invalid: %~ will strip surrounding quotes if any

For valid formats type CALL /? or FOR /?

Тот же эффект, если REM изменяется на ::.

Похоже, что анализатор игнорирует индикатор комментария и анализирует %~.Если я поставлю пробел между % и ~, то он будет работать нормально.

Windows 7 Enterprise (другие версии не проверялись).

Для меня это похоже на ошибку,но я что-то упустил?

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Я думаю, что в нескольких документах ясно, что cmd интерпретирует аргументы перед комментариями, см. Пример в комментарии @LotPings, а также в посте @ aschiphl.При этом, вы можете на мгновение disableextensions, а затем включить его при необходимости.В приведенном ниже примере показано, как отключение этого параметра позволит вам использовать его в комментарии REM, а затем снова включить после отображения разрешенных расширений:

@echo off
setlocal disableextensions
REM %~ will strip surrounding quotes if any"
endlocal
echo my batch file is %~0
0 голосов
/ 21 ноября 2018

Расширение %, следовательно, расширение нормальных переменных среды (например, %VAR%), а также аргументов командной строки (например, %0), является самым первым шагом после прочтения строки, поэтому это происходит еще докоманда rem распознана.Таким образом, вам нужно избегать %~ (например, записывая rem % + ~ ...).

Учитывая, что включены расширения команды , что по умолчанию в любом случае, %~распознается как неверный синтаксис аргумента (ожидается, что за ~ будет следовать десятичная цифра, обозначающая позицию аргумента, или допустимый модификатор, такой как f, d, p, n, x и т. д..; см. Аргументы командной строки (параметры) ), что приводит к фатальной ошибке, означающей, что выдается сообщение об ошибке и обработка пакетного файла прерывается (%ErrorLevel% не заданохотя).

Тот же эффект появляется при попытке сделать подстроку подстановки , но при указании пустой строки поиска (например, %VAR:=replace% или %VAR:*=replace%, учитывая, что VARопределяется), также с включенными расширениями команд.

См. также эту ветку: Как синтаксический анализ сценариев интерпретатора команд Windows (CMD.EXE)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...