字符串中的批处理脚本子字符串
问题描述:
好的,我一直在玩这个游戏一段时间,并没有得到任何地方。我需要从一行中拉出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
答
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 %"
究竟是如何得到如此之快的速度?!?! :-) – 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