2012-08-02 3 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 정규식의 경우 :

for /f "delims=-" %%A in ("!val!") do set "val=KB%%A" 
: findstr /brc:"[0-9]*-"

그런 다음 당신은 당신이 길이를 모를 때 번호를 추출하려면 다음 중 하나를 사용할 수있는 첫번째 정규 표현식에 대한

또는

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

어떻게 그렇게 빨리 upvoted가 되었습니까?!?! :-) – dbenham

+1

나는 그 해답을 찾고 있었다. "새로운 답변 게시 됨"이 나타나는 것을 보았고, 새로운 답변을 보았고, 그것을 upvoted했고, 내 것을 버렸다. :-) 다음과 같은 점에주의 할 필요가 있습니다. a) "KB"접두사가없는 KB 이름을 반환하고 b) 두 줄 샘플의 첫 번째 줄에있는 "KB_"와 일치합니다 (첫 번째 참조 인 두 번째와 두 번째는 내가 포스터가 원하는 것입니다), 그래서 정규식은 두 가지에 조정해야 할 수도 있습니다. –

+0

@KenWhite - 아, 두 번째 줄에 숨어있는 두 번째 KB를 보지 못했으며 '_'이 숫자로 간주되어야한다고 생각했습니다.KB 접두사에 대해서도 취한 점. 내가 고칠거야. 감사. – dbenham

관련 문제