2012-08-02 118 views
1

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

回答

5

OK - 看到從肯白色和OP意見後siginificant編輯。

我不確定你是否需要這個,但是有正則表達式的FINDSTR可以驗證該行有模式:「-KB」後面跟着7位數,後面跟着「 - 」。

echo somestring|findstr /r /c:"-KB[0-9][0-9][0-9][0-9][0-9][0-9][0-9]-" >nul 

然後使用替代通過「KB-」從開頭刪除所有內容。

然後使用FINDSTR驗證前7個剩餘字符是數字。如果沒有,然後循環回來並替換到下一個「-KB」等。

然後你只需要採取第一個剩餘的7個字符。

@echo off 
:parseVal 
setlocal enableDelayedExpansion 
set val="%~1" 
echo !val!|findstr /r /c:"-KB[0-9][0-9][0-9][0-9][0-9][0-9][0-9]-" >nul || (
    echo Invalid format - KB value not found 
    exit /b 
) 
:parseVal2 
set "val=!val:*-KB=!" 
echo !val!|findstr /brc:"[0-9][0-9][0-9][0-9][0-9][0-9][0-9]-" >nul || goto :parseVal2 
set "val=KB!val:~0,7!" 
echo val=!val! 
exit /b 


編輯

我不知道你沒有接受6個數字是什麼,但下面的正則表達式的表達式將任意長度的數字工作。

對於第一個正則表達式:findstr /rc:"-KB[0-9]*-"
對於第2個正則表達式:findstr /brc:"[0-9]*-"

然後你可以使用以下方法來解壓出來的數量,當你不知道的長度之一:

for /f "delims=-" %%A in ("!val!") do set "val=KB%%A" 

set val=KB%val:-=&REM %" 
+0

究竟是如何得到如此之快的速度?!?! :-) – dbenham 2012-08-02 01:25:22

+1

我正在研究一個答案。看到「貼出的新答案」出現,看了一下新答案,提出了答案,並拋棄了我的答案。 :-)您可能想要注意到:a)返回不帶「KB」前綴的KB名稱,並且b)與兩行樣本的第一行中的「KB_」匹配(這是第一個引用,不是第二個,第二個是我認爲海報想要的),所以正則表達式可能需要針對這兩件事情進行調整。 – 2012-08-02 01:31:39

+0

@KenWhite - 啊,我沒有看到第二行中隱藏的第二個KB,並假定'_'應該被認爲是一個數字。還有關於KB前綴的點。我會解決它。謝謝。 – dbenham 2012-08-02 01:35:28

相關問題