在批处理中解析字符串输出

4
我有一个通过调用批处理程序中的 avp.com 进行扫描的 Kaspersky 输出。我将这个输出保存在一个名为 RES 的变量中,该变量的内容如下:
我需要解析此字符串以获取上述示例中 Total detected 值,该值为 0 。我尝试使用批处理中的 for 语句,但没有得到预期的结果。
注意:带有 @mbroshi 答案的编辑。
set KAVDir="C:\Program Files (x86)\Kaspersky Lab\Kaspersky Endpoint Security 10 for Windows\avp.com"
for /f "tokens=3 delims= " %%i in ('%KAVDir% /i0 %1 ^| FINDSTR "Total detected"') 
do 
( 
SET RES=%%i 
ECHO %RES% 
)

执行avp.com程序的输出文本为:
2014-02-26 15:01:58 Scan_Objects$0697         starting   1%         
; --- Settings ---
; Action on detect:     Ask user
; Scan objects:         All objects
; Use iChecker:         Yes
; Use iSwift:           Yes
; Try disinfect:        Yes
; Try delete:           Yes
; Try delete container: No
; Exclude by mask:      No
; Include by mask:      No
; Objects to scan:      
;   "D:\Codigo\Git_Segmail\mail_filters\segmail20\server\service_node_helpers\antivirusscripts\eicar.com.txt"   Enable=Yes  Recursive=No
; ------------------
2014-02-26 15:01:58 D:\Codigo\Git_Segmail\mail_filters\segmail20\server\service_node_helpers\antivirusscripts\eicar.com.txt:Zone.Identifier ok
Progress 50%...
2014-02-26 15:01:58 D:\Codigo\Git_Segmail\mail_filters\segmail20\server\service_node_helpers\antivirusscripts\eicar.com.txt detected    EICAR-Test-File
Progress 50%...
2014-02-26 15:01:58 Scan_Objects$0697         running    50%        
2014-02-26 15:02:00 D:\Codigo\Git_Segmail\mail_filters\segmail20\server\service_node_helpers\antivirusscripts\eicar.com.txt was deleted
2014-02-26 15:02:00 Scan_Objects$0697         completed             
;  --- Statistics ---
;  Current time:    2014-02-26 15:02:00
; Time Start:           2014-02-26 15:01:58
; Time Finish:          2014-02-26 15:02:00
; Completion:           100%
; Processed objects:    2
; Total detected:       1
; Detected exact:       1
; Suspicions:           0
; Treats detected:      1
; Untreated:            0
; Disinfected:          0
; Quarantined:          0
; Deleted:              1
; Skipped:              0
; Archived:             0
; Packed:               0
; Password protected:   0
; Corrupted:            0
; Errors:               0
; Last object:          
;  ------------------
2个回答

3
@ECHO OFF
SETLOCAL
set KAVDir="C:\Program Files (x86)\Kaspersky Lab\Kaspersky Endpoint Security 10 for Windows\avp.com"
FOR /f "eol=#tokens=2delims=:" %%a IN ('%KAVDir% /i0 %1 ^|find "Total detected"') DO SET /a totdet=%%a
ECHO Total detected is %totdet%
GOTO :EOF

注意,findstr "Total detected" 会查找包含“Total” “detected”的任何行,因此使用了FIND (也可以使用findstr /c:“Total detected”

是的 - 我忘记了 /c。更重要的是,我忘记了默认的行尾符是 ; - mbroshi
感谢两位的回复,特别是这个帮我解决了问题,然后我知道了另一个的问题所在。谢谢 @mbroshi 和 @Magoo! - yosbel
请注意,在此示例中正常工作需要在%KAVDir%之前添加call语句。 - yosbel

2
您可以使用管道符号 FINDSTR 来获取您所需的行:
set KAVDir="C:\Program Files (x86)\Kaspersky Lab\Kaspersky Endpoint Security 10 for Windows\avp.com"
for /f "eol=# tokens=4 delims= " %%i in (
    '%KAVDir% /i0 %1 ^| FINDSTR /C:"Total detected"'
) do (
    set RES=%%i
)

编辑: 正如Magoo所指出的那样,我需要添加一个/C来搜索确切的字符串“Total detected”,并在for循环中添加不同的eol,因为默认情况下它将跳过以;开头的行。


谢谢您的回复@mbroshi,我不知道为什么设置的RES值是一个空字符串。我应该尝试其他方法吗?谢谢 - yosbel
@yosoy 你能把你问题中的那一行文本发出来吗?我正在将分隔符设置为空格,并在上述脚本中获取第三个标记。例如,也许在 %KAVdir% 变量中有制表符。 - mbroshi
我已经编辑了问题,将我在.bat文件中确切的文本放入其中。我添加了call语句,但仍然没有好的结果。我还通过调用此语句并将输出保存到文件中来放置了call语句的输出。 - yosbel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接