(BATCH) Программа выключается без какой-либо подробной ошибки - PullRequest
0 голосов
/ 09 мая 2019

Я работаю над небольшим приложением для очистки журналов и создаю раздел, в котором пользователь может развернуть бота для автоматической очистки журналов событий Windows по заданному времени.

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

Вот раздел, где происходит отключение:

:bot.noexist.15
if %bot.logtype%=="all" set bot.logtype=all
if %bot.logtype%=="All" set bot.logtype=all
if %bot.logtype%=="Application" set bot.logtype=app
if %bot.logtype%=="application" set bot.logtype=app
if %bot.logtype%=="Security" set bot.logtype=sec
if %bot.logtype%=="security" set bot.logtype=sec
if %bot.logtype%=="System" set bot.logtype=sys
if %bot.logtype%=="system" set bot.logtype=sys
if %bot.logtype%=="application, security" set bot.logtype=app,sec
if %bot.logtype%=="application, system" set bot.logtype=app,sys
pause
if %bot.logtype%=="security, application" set bot.logtype=app,sec
if %bot.logtype%=="security, system" set bot.logtype=sec,sys
if %bot.logtype%=="system, application" set bot.logtype=app,sys
if %bot.logtype%=="system, security" set bot.logtype=sec,sys
pause
echo %bot.logtype%
pause
goto bot.noexist.14

Я сузил суть проблемы. Он находится между первыми двумя паузами.

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

Редактировать: так как многие задаются вопросом, я ранее уже set bot.logtype="%bot.logtype%".

Ответы [ 2 ]

0 голосов
/ 09 мая 2019

Я бы рекомендовал вместо этого использовать команду Choice, чтобы пользователи не могли печатать, вместо этого просто дайте им выбрать из списка:

@echo off
echo select one:
echo    [1] For Application
echo    [2] For Security
echo    [3] For System
echo    [4] For System and Security
echo    [5] For System and Application
echo    [6] For Security and Application
echo    [7] For Security and System
echo    [8] For All (Application, Security and System)

choice /C 12345678
goto :%errorlevel%
goto :eof
:1
echo Clear Application logs here
goto :eof
:2
echo Clear Security logs here
goto :eof
:3
echo Clear System logs here
goto :eof
:4
echo Clear System and Security logs here
goto :eof
:5
echo Clear System and Application logs here
goto :eof
:6
echo Clear For Security and Application
goto :eof
:7
echo Clear Security and System logs here
goto :eof
:8
echo Clear All logs here
0 голосов
/ 09 мая 2019

Фактический ответ:

Давайте шаг за шагом пройдемся по части, которая генерирует ошибки -
Предположим, что значение %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
...