Почему пакет интерпретирует комментарии? - PullRequest
0 голосов
/ 02 мая 2018

У меня есть простой пакетный тестовый файл test.bat со следующими строками:

@echo off
REM IF "%~version_info" == "" echo No version information found
echo test

Когда я запустил его, я ожидал получить тест, вместо этого я получил:

The following usage of the path operator in batch-parameter
substitution is invalid: %~version_info" == "" echo No version information found


For valid formats type CALL /? or FOR /?
The syntax of the command is incorrect.

Почему пакет пытается интерпретировать комментарий? Или что здесь происходит? Если я уберу комментарий, скрипт распечатает тест, как и ожидалось.

Также документация ничего не упоминает об этом.

Ответы [ 5 ]

0 голосов
/ 02 мая 2018

Зачем пакетно интерпретировать комментарии?

Он не интерпретирует комментарии, но должен анализировать строки, вот в чем проблема.

Сначала парсер читает строку.

Затем он расширяет все процентные выражения и затем смотрит на первый токен в строке.
Если первый токен равен REM, то оставшиеся данные больше не будут интерпретироваться (перенаправление, отложенное расширение, каналы, амперсанды, ..., все игнорируются)

Проблема в том, что синтаксический анализатор сначала раскрывает все процентные выражения, когда существует такое выражение, как %~, а затем анализатор выдает сообщение об ошибке.

0 голосов
/ 02 мая 2018

Причиной этого является последовательность пакетных сценариев.

Самое первое, что происходит, - это (плохая 1 ) % -знаковая обработка, то есть нормальная переменная (%VAR%) и аргумент командной строки (%1, * 1008). * и т. д. и %*) расширение. Команды и, следовательно, даже rem распознаются на более позднем этапе анализа.

Строка %~ является недопустимой ссылкой на аргумент, поскольку нет ни действительного модификатора, ни их комбинации (f, d, p, n, x, s , a, t, z, $PATH:) или после цифровой цифры.

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


1 ... Расширение %, на мой взгляд, некорректно, потому что %~ или %VAR:=, %VAR:*=, в случае определения переменной VAR, приводят к ошибке и переменной расширение, например %VAR:[*]search=[replace]% или %VAR:~[position][,[length]]%, прерывается, если VAR не определено (поэтому %VAR:~%STR% расширяется до ~text, если STR установлено на text).

0 голосов
/ 02 мая 2018

Если вы не хотите изменять закомментированный код, вы можете использовать:

REM %= IF "%~version_info" == "" echo No version information found

Хотя это немного некрасиво, это не поможет интерпретировать %~.

Вы можете найти больше информации о комментариях в пакете в этот ответ

Относительно того, почему это так, вся партия звучит немного разбито.

0 голосов
/ 02 мая 2018

Я считаю, что это является следствием последовательности синтаксического анализа. В этом случае это проблема, но предположим, что вы код (как я сделал):

set "debug=rem"
%debug% echo some debug data

Сначала мы заменяем значения в %vars%, затем интерпретируем строку, используя первый токен в качестве команды для выполнения. Приведенная выше конструкция позволяет изменять команду.

Так что есть метод к безумию ...

0 голосов
/ 02 мая 2018

Это не игнорирование.

В пакетных файлах вам нужно добавить %%, а не %, поэтому он просто предупреждает вас, что подстановка недопустима. cmdline все еще читает строки комментариев и видит, что в них есть действительная команда, но неправильный метод, она предупредит вас.

Делая это, вы не получите предупреждение:

@echo off
REM IF "%%~version_info" == "" echo No version information found
echo test
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...