1

わかりました、私はしばらくこれをいじっていましたが、どこにも行きません。行から KB 番号を引き出す必要があります。

私が抱えている問題は、KB 番号の一部が 6 文字で、一部が 7 文字であり、この 2 つをエラー検出する方法が見つからないようです。

これにより発生する2種類のエラーは次のとおりです

最初のものは6文字しか表示されないはずだったので、最後に余分な「-」を追加しました。

x64 KB890830-   2012\MS12-000\WinSec-KB890830-006-P58310-Windows-KB890830-x64-V4.9.exe 

2 番目のエラーでは、2 番目ではなく最初の 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
4

1 に答える 1

5

OK - Ken White と OP からのコメントを見た後の重要な編集。

これが必要かどうかはわかりませんが、正規表現を使用した 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 桁の数字を受け入れるために何をしたかはわかりませんが、次の正規表現は任意の長さの数字で機能します。

1 番目の正規表現の場合: 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 %"
于 2012-08-02T01:23:37.963 に答える