我正在开发一个小型日志清除应用程序,并且正在创建一个区域,用户可以在该区域中部署机器人以在给定的时间自动清除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%"
的ID。
答案 0 :(得分:1)
让我们一步一步地介绍引发错误的部分-
假设%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
这种毛病将继续存在,因为它可能与将来发现此问题的人有关。
第一季度-%bot.logtype%
的值永远不会变成nul
吗?
如果%bot.type%
是基于用户输入的,那么您将遇到问题,或者在开始比较时可能会遇到未设置它的情况。
您可以在if
语句中通过添加要比较的字符来处理此问题。最常见的是""
(原因是第二季度):
if "%emptyVar%"=="" echo emptyVar is empty
:: Can be done with any character(s)
if #%emptyVar%==# echo emptyVar is empty
%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
IF /I
开关吗?
如果启用了命令扩展,则IF的更改如下:
IF
...
IF [/I] string1 compare-op string2 command
开关(如果指定)表示区分大小写的字符串 比较。/I
开关也可以在/I
表单上使用string1==string2
中的。这些比较是通用的,因为如果string1和 string2均由所有数字组成,则字符串为 转换为数字并执行数字比较。
利用此功能,您可以将IF
语句减少一半。
所以:
IF
成为:
if %bot.logtype%=="Security" set bot.logtype=sec
if %bot.logtype%=="security" set bot.logtype=sec
答案 1 :(得分:1)
我建议改用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