Batch-Script Substring aus string
Ok, ich habe gespielt, um mit diesem für eine Weile, und bin immer nicht, wo. Ich muss zum herausziehen des KB-Nummer aus einer Linie.
Das Problem, das ich habe ist, dass einige der KB-Nummern sind 6 Zeichen, und einige sind 7, und kann nicht scheinen, um einen Weg zu finden, die funktioniert, um Fehler zu erkennen die beiden.
Den Zwei Arten von Fehlern, die dies leistet, wird wie folgt
Die Erste sollte nur angezeigt wurden 6 characts, so dass es zusätzlichen "-" am Ende.
x64 KB890830- 2012\MS12-000\WinSec-KB890830-006-P58310-Windows-KB890830-x64-V4.9.exe
Während der zweite Fehler zeigt die zufällige "_", weil es verwendet die erste KB angezeigt, nicht die zweite.
ia64 KB_942288 2012\MS12-000\WinSec-KB_942288-007-P58312-WindowsServer2003-KB942288-v4-ia64.exe
BEARBEITEN
Batch-Datei So Weit
@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
Du musst angemeldet sein, um einen Kommentar abzugeben.
OK - siginificant Bearbeiten, nachdem ich Kommentare von Ken White und die OP.
Ich bin mir nicht sicher, ob Sie dies brauchen, aber FINDSTR mit regulären Ausdrucks können Sie überprüfen, dass die Zeile dem Muster: "-KB" gefolgt von 7 Ziffern, gefolgt von "-".
Dann ist mithilfe der substitution zu entfernen, alles von Anfang an durch "KB-".
Dann FINDSTR verwenden, um zu überprüfen, dass die ersten 7 übrige Zeichen sind Ziffern. Wenn nicht, dann Schleife zurück und ersetzen Sie bis zu den nächsten "-KB", etc.
Dann brauchen Sie nur die ersten 7 verbleibenden Zeichen.
BEARBEITEN
Ich bin mir nicht sicher, was du getan hast zu akzeptieren, die 6-stellige zahlen, aber die folgenden regex-Ausdrücke arbeiten mit zahlen beliebiger Länge.
Für die 1. regex:
findstr /rc:"-KB[0-9]*-"
Für das 2. regex:
findstr /brc:"[0-9]*-"
Dann Sie können verwenden Sie eine der folgenden extrahieren Sie die Nummer, wenn Sie nicht wissen, die Länge:
oder
_
war angeblich eine Ziffer. Punkt getroffen, über die KB-Präfix gut. Ich werde das beheben. Danke.