Я пытаюсь использовать эту строку в пакетном файле
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")