好的,我一直在玩這個遊戲一段時間,並沒有得到任何地方。我需要從一行中拉出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