Фактический ответ:
Давайте шаг за шагом пройдемся по части, которая генерирует ошибки -
Предположим, что значение %bot.logtype%
равно "security, application"
.
if %bot.logtype%=="security, application" set bot.logtype=app,sec
Это нормально, теперь %bot.logtype%
равно app,sec
.
if %bot.logtype%=="security, system" set bot.logtype=sec,sys
:: Equivalent to:
:: if app,sec=="security, system" …
:: sec=="security, system" was unexpected at this time.
Проблема в запятых в новом значении %bot.logtype%
.
Есть несколько способов исправить это:
Метод 1
Добавить оператор goto label
-
if %bot.logtype%=="security, system" set bot.logtype=sec,sys & goto finish
:: if …
:finish
:: Code here
Метод 2
Окружите ваше новое значение в ""
снова -
if %bot.logtype%=="security, application" set bot.logtype="app,sec"
Метод 3
Не используйте запятые -
if %bot.logtype%=="security, application" set bot.logtype=app/sec
Этот пух останется, потому что он может быть актуален для тех, кто найдет этот вопрос в будущем.
Q1 - Значение %bot.logtype%
никогда не будет nul
?
Если %bot.type%
основан на пользовательском вводе, у вас будут проблемы, или если когда-либо будет случай, когда он не будет установлен, когда вы начнете сравнивать его.
Вы можете справиться с этим в своих if
инструкциях, добавив дополнительные символы для сравнения. Наиболее распространенным является ""
(причина: Q2 ):
if "%emptyVar%"=="" echo emptyVar is empty
:: Can be done with any character(s)
if #%emptyVar%==# echo emptyVar is empty
Q2 - Содержимое %bot.type%
заключено в ""?
При сравнении переменной со значением с пробелами она должна быть заключена в
""
для предотвращения ошибок. Если нет, то ваш оператор
if
расширится так:
set "myStr=string with spaces"
if %myStr%==value echo.
:: expands to
if string with spaces==value
:: which returns
"with" was not expected at this time
Это можно исправить, инкапсулируя переменную в ""
при сравнении:
set "myStr=string with spaces"
if "%myStr"=="string with spaces" echo true
:: returns true
Q3 - Вы слышали о переключателе IF /I
?
Согласно документации
IF
командной строки:
Если расширения команд включены, IF изменяется следующим образом:
IF [/I] string1 compare-op string2 command
... переключатель /I
, если указан, говорит, что нужно делать строку без учета регистра
сравнивает. Переключатель /I
также можно использовать в форме string1==string2
IF
. Эти сравнения являются общими, в том случае, если как string1, так и
строка2 состоит из всех числовых цифр, тогда строки
конвертируется в числа и выполняется числовое сравнение.
Используя это, вы можете сократить свои IF
заявления вдвое.
Итак:
if %bot.logtype%=="Security" set bot.logtype=sec
if %bot.logtype%=="security" set bot.logtype=sec
становится:
if /i %bot.logtype%=="security" set bot.logtype=sec