Пакетный файл Windows для недействительных обновлений Microsoft

Я поражен при создании командного файла Windows, который просто указывает, установлена ​​ли недействительная статья KB на моем компьютере / сервере Windows.

Это где я сейчас,

Сценарий:

@ECHO OFF
WMIC QFE GET HOTFIXID>%~dp0QFE_list.txt
FOR /f "delims=," %%a IN (%~dp0Patch_List.txt) DO (
    CALL :PATCH_LIST %%a
)
GOTO :EOF

:PATCH_LIST
REG QUERY "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" /s /f "%1">NULL.txt
IF %ERRORLEVEL% EQU 0 ECHO %1: INSTALLED
IF %ERRORLEVEL% NEQ 0 (
ECHO FIND %1
FIND /C "%1" %~dp0QFE_List.txt>NULL.txt
IF ERRORLEVEL 0 ECHO %1: QFE INSTALLED
IF ERRORLEVEL 1 ECHO %1: **** NOT INSTALLED! ****
)

Текущий вывод: ---------- C:\USERS\PVENK17\DESKTOP\TEST\QFE_LIST.TXT: 1

Желаемый вывод:: Установлено

Содержание входного файла: KB3057839,KB3002657

Выпуск:

Хотя это работает для 1 KBarticle. Когда я помещаю более 1 во входной файл, он не работает.

Пожалуйста, помогите мне решить эту проблему.

Спасибо прашант

3 ответа

@echo off
title HOTFIXID_KB_FOUND
setlocal enabledelayedexpansion
cd /d "%~dp0"
for /f %%A in (KB_list.txt) do (
wmic qfe get hotfixid |findstr /i "%%A"
if !errorlevel! equ 0 echo %%A: ****INSTALLED****
if !errorlevel! equ 1 echo %%A: NOT INSTALLED
)
pause

KB_list.txt, в моем случае, это список вредоносных обновлений, ведущих к BSOD. Можно, конечно, автоматизировать и удалить, но не всегда получить wusa.exe, иногда требуется dism.exe.

Пример удаления с помощью wusa.exe

wusa.exe /uninstall /kb:3065987 /quiet /norestart
shutdown.exe -r -t 05

Пример удаления с помощью dism.exe

DISM /Online /Get-Packages /Format:Table
DISM /Online /Remove-Package /PackageName:Package_for_KB3045999~31bf3856ad364e35~amd64~~6.1.1.1

Я могу сделать эту работу, изменив формат входного файла: 1 КБ на строку

KB3057839
KB3002657

Затем просто удалите материал "delims", и он работает для нескольких элементов. Не уверен в логике последних строк. Кажется, говорят "установлено / не установлено"

И кстати, перенаправить ваши команды на NUL чтобы избежать создания бесполезного файла.

@ECHO OFF
WMIC QFE GET HOTFIXID>%~dp0QFE_list.txt
FOR /f %%a IN (%~dp0Patch_List.txt) DO (
    CALL :PATCH_LIST %%a
)
GOTO :EOF

:PATCH_LIST
REG QUERY "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" /s /f "%1">NUL
IF %ERRORLEVEL% EQU 0 ECHO %1: INSTALLED
IF %ERRORLEVEL% NEQ 0 (
ECHO FIND %1
FIND /C "%1" %~dp0QFE_List.txt>NUL
IF ERRORLEVEL 0 ECHO %1: QFE INSTALLED
IF ERRORLEVEL 1 ECHO %1: **** NOT INSTALLED! ****
)

После гораздо большей отладки я написал этот код, я знаю, что это не идеальное решение, но оно работает

Код:

@ECHO OFF
title IllegalPatchCheck

echo Select a server. (AW/PG)
set /p server=

IF /i "%server%"=="AW" goto AdminWorkstation
IF /i "%server%"=="PG" goto PeripheralGateway

echo Invalid Input.
goto commonexit

:AdminWorkstation

WMIC QFE GET HOTFIXID>%~dp0QFE_list.txt

find /c "KB3057839" %~dp0QFE_list.txt>nul
if %errorlevel% equ 1 ECHO KB3057839  NOT Found
if %errorlevel% neq 1 ECHO KB3057839 Found

find /c "KB3058515" %~dp0QFE_list.txt>nul
if %errorlevel% equ 1 ECHO KB3057839  NOT Found
if %errorlevel% neq 1 echo KB3058515 Found

find /c "KB3059317" %~dp0QFE_list.txt>nul
if %errorlevel% equ 1 echo KB3059317 NOT found
if %errorlevel% neq 1 echo KB3059317 Found

find /c "KB3063858" %~dp0QFE_list.txt>nul
if %errorlevel% equ 1 echo KB3063858 NOT found
if %errorlevel% neq 1 echo KB3063858 Found

goto commonexit

:PeripheralGateway

WMIC QFE GET HOTFIXID>%~dp0QFE_list.txt

find /c "KB2984972" %~dp0QFE_list.txt>nul
if %errorlevel% equ 1 echo KB2984972 NOT Found
if %errorlevel% neq 1 echo KB2984972 Found

find /c "KB3046049" %~dp0QFE_list.txt>nul
if %errorlevel% equ 1 echo KB3046049 NOT Found
if %errorlevel% neq 1 echo KB3046049 Found

find /c "KB3002657" %~dp0QFE_list.txt>nul
if %errorlevel% equ 1 echo KB3002657 NOT Found
if %errorlevel% neq 1 echo KB3002657 Found

goto commonexit

:commonexit
del /q /f %~dp0QFE_list.txt >nul
pause

Спасибо прашант

Другие вопросы по тегам