2012-08-02 120 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