好的,我一直在玩这个游戏一段时间,并没有得到任何地方。我需要从一行中拉出KB数字。字符串中的批处理脚本子字符串
我遇到的问题是一些KB数字是6个字符,有些是7,似乎无法找到一种方法,将错误检测到这两个。
两种类型的错误这使得的是如下
第一个应该只已显示6个characts所以添加额外的“ - ”结尾。
x64 KB890830- 2012\MS12-000\WinSec-KB890830-006-P58310-Windows-KB890830-x64-V4.9.exe
虽然第二个错误显示随机“_”,因为它使用显示的第一个KB而不是第二个。
ia64 KB_942288 2012\MS12-000\WinSec-KB_942288-007-P58312-WindowsServer2003-KB942288-v4-ia64.exe
编辑 批处理文件到目前为止
@ECHO OFF
SETLOCAL enableDelayedExpansion
IF EXIST Export.csv DEL Export.csv
FOR /F "tokens=*" %%I in ('dir /s /b *.*') DO CALl:Generate "%%I"
pause
:Generate
SETLOCAL
IF "%~x1" NEQ ".exe" (
If "%~x3" NEQ ".msu" (
GOTO:EOF
)
)
CALL:FindArchitecture %1
CALL:FindKB %1
CALL:PathFix %1
ECHO %Architecture%,%KB%,%FilePath%>>Export.csv
CALL:Cleanup
ENDLOCAL
GOTO:EOF
:FindArchitecture
ECHO %1 | FINDSTR "x64"
IF "%ERRORLEVEL%"=="0" (
SET Architecture=x64
SET Count+=1
)
ECHO %1 | FINDSTR "x86"
IF "%ERRORLEVEL%"=="0" (
SET Architecture=x86
SET Count+=1
)
ECHO %1 | FINDSTR "ia64"
IF "%ERRORLEVEL%"=="0" (
SET Architecture=ia64
SET Count+=1
)
IF "%Count%" GTR "1" (
SET Architecture=Error
)
SET Count=0
GOTO:EOF
:FindKB
set KBNum="%~1"
set "KBNum=!KBNum:*-KB=!"
ECHO !KBNum!|findstr /I /E /R /c:"-KB[0-9][0-9][0-9][0-9][0-9][0-9][0-9]" >nul
SET "KB=KB!KBNum:~0,7!"
IF "%KB%" NEQ "" GOTO:EOF
ECHO !KBNum!|findstr /I /E /r /c:"-KB[0-9][0-9][0-9][0-9][0-9][0-9]" >nul
SET "KB=KB!KBNum:~0,6!"
GOTO:EOF
:PathFix
set Path_to_convert=%~1
set Reference_path=%~dp0
set FilePath=!Path_to_convert:*%Reference_path%=!
GOTO:EOF
:Cleanup
SET KBNum=
SET KB=
SET Count=
SET Architecture=
set InstallerPath=
set PathRemoval=
set Path=
GOTO:EOF
究竟是如何得到如此之快的速度?!?! :-) – dbenham 2012-08-02 01:25:22
我正在研究一个答案。看到“贴出的新答案”出现,看了一下新答案,提出了答案,并抛弃了我的答案。 :-)您可能想要注意到:a)返回不带“KB”前缀的KB名称,并且b)与两行样本的第一行中的“KB_”匹配(这是第一个引用,不是第二个,第二个是我认为海报想要的),所以正则表达式可能需要针对这两件事情进行调整。 – 2012-08-02 01:31:39
@KenWhite - 啊,我没有看到第二行中隐藏的第二个KB,并假定'_'应该被认为是一个数字。还有关于KB前缀的点。我会解决它。谢谢。 – dbenham 2012-08-02 01:35:28