Использование знаков процента (%) в операторе echo на той же строке, что и условная проверка переменной IF

Использование знаков процента (%) в операторе echo на той же строке, что и условная проверка переменной IF

Я пытаюсь использовать эту строку в пакетном файле

If NOT "%1%"=="foo" (echo %bar% Text. >> "%USERPROFILE%\Desktop\Log File.txt")

и когда я его запускаю я получаю это

) was unexpected at this time.

C:\>      If NOT "ARGUMENTBARUSERPROFILE\Desktop\Log File.txt")

(АРГУМЕНТ = любой аргумент/параметр, который я использовал при запуске пакетного файла)

Я перепробовал всевозможные варианты, включая изменение "Log File.txt" на "LogFile.txt" и удаление кавычек вокруг пути, и сузил его до того факта, что он прерывается, когда есть знак  %(при попытке вывести переменную) или двоеточие (от пути справа от >>). Я понятия не имею, в чем проблема с двоеточием, но %похоже, что оно жадное и читает строку так, что проверяемая переменная — это вся объединенная строка всего содержимого, заключенного в пару,  %плюс остальная часть строки (вероятно, потому что после нее нет оператора, поэтому она просто продолжается до EOL, где она упирается в скобки). Так что, похоже, либо что-то нужно экранировать, либо мне нужно что-то еще изменить, либо это просто невозможно.

Я понимаю, что я мог бы просто поместить оператор echo на другую строку, например так

If NOT... (
  echo...
)

но я бы предпочел сделать это в одну строку, отчасти потому, что так чище, но в основном просто потому, что мне любопытно и нравится разбираться в таких вещах, и я ненавижу, когда у меня это не получается.

Кстати, отложенное выражение включено.

EDIT: основываясь на комментарии @AFH, я протестировал его в пакетном файле отдельно и обнаружил, что это

@echo on
setlocal enableDelayedExpansion
SET bar=test
If NOT "%1%"=="foo" (echo %bar% Text. >> "%USERPROFILE%\Desktop\Log File.txt")

не выдает ошибку, но ставитчто-либопосле него (например, endlocalна следующей строке или даже на пустой следующей строке).Однако, использование %1вместо %1%, как упоминал ADH, исправило это, так что это была проблема. Поэтому это решено.

решение1

Я не смог воспроизвести вашу ошибку в точности, но могу подтвердитьНаблюдение AFHчто параметры командной строки (например,  , , и т.д.) а не , поэтому ваша команда должна быть%n%1%2%n%

If NOT "%1"=="foo" (echo %bar% Text. >> "%USERPROFILE%\Desktop\Log File.txt")

Я считаю, что могу пролить свет на то, что происходит, когда вы включаете дополнительный  %. CMD, похоже, анализирует командные строки на предмет параметров и переменных, прежде чем делать что-либо еще, и использует очень простой парсер. Когда он сталкивается с  %,

  • если следующий символ — цифра, то это позиционный параметр;%n
  • если это что-то еще, то это переменная ( ), и%name%вседо следующего %- этоname. Я думаю, если нет соответствия, все становится действительно запутанным %.

Вот как анализируется ваша команда:

If NOT "%1%"=="foo" (echo %bar% Text. >> "%USERPROFILE%\Desktop\Log File.txt")
        \/\---------------/   \-----------/           \---------------------- ...?

Он думает, что "=="foo" (echo и  Text. >> "— это имена переменных, а barи USERPROFILE— это литеральный текст. Например, запуск вашей команды с аргументом «hello» выдал это сообщение об ошибке, похожее на то, что получили вы:

Синтаксис команды неверный.
 
С:(Текущий каталог)> Если НЕ "hellobarUSERPROFILE\Desktop\Log File.txt")

Связанный контент