(BATCH)程序关闭,没有任何冗长的错误

时间:2019-05-09 00:33:43

标签: windows batch-file logging bots event-log

我正在开发一个小型日志清除应用程序,并且正在创建一个区域,用户可以在该区域中部署机器人以在给定的时间自动清除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。

2 个答案:

答案 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开关吗?
根据{{​​1}}命令行文档:

  

如果启用了命令扩展,则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