CMD/BAT - Список обновлений KB

Аватара пользователя
sov44

CMD/BAT - Список обновлений KB

Сообщение sov44 »

Нужна помощь в написании скрипта по выводу всех обновлений типа КВ* в разделе и подразделах HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall

начал примерно так



Код:

Код: Выделить всё

@ECHO OFF
SetLocal enabledelayedexpansion
SET UNISTALL=HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall
FOR /f "tokens=7 delims=\" %%a IN ('reg query "%UNISTALL%"') DO (
set "upd=%%a"
if /i "!upd:~0,2!"=="KB" echo !upd!
)
pause
Аватара пользователя
gora

Re: CMD/BAT - Список обновлений KB

Сообщение gora »

Цитата sov44:



по выводу всех обновлений
CMD/BAT - Список обновлений KB




Такой подойдет?

Код:

Код: Выделить всё

wmic qfe get Caption, Description, HotFixID, InstalledOn >ListUpdates.txt

Форматированный список (со ссылками и прочими подробностями) в ListUpdates.txt
Аватара пользователя
sov44

Re: CMD/BAT - Список обновлений KB

Сообщение sov44 »

Цитата gora:



Такой подойдет?
CMD/BAT - Список обновлений KB




наверное нет, т.к. в дальнейшем при установке обновлений планируется их перебор. Устанавливать только те, которых нет в системе.

п.с. в посте 1 столкнулся в проблемой отображения обновлений в "чистом" виде, то есть только в виде КВ123456 или КВ1234567 без дополнительных символов в конце.
Аватара пользователя
sov44

Re: CMD/BAT - Список обновлений KB

Сообщение sov44 »

Вроде сделал. Прошу проверить верность скриптов и подсказать, как их объединить в один



Код:

Код: Выделить всё

@ECHO OFF
SetLocal enabledelayedexpansion
SET UNISTALL=HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall
FOR /f "tokens=7 delims=\" %%a IN ('reg query "%UNISTALL%"') DO (
set "upd=%%a"
if /i "!upd:~0,2!"=="KB" (
set "up1=!upd:~0,9!"
if /i "!up1:~-1!"=="-" set "up1=!up1:~0,8!"
if /i "!up1:~-1!"=="_" set "up1=!up1:~0,8!"
echo !up1!
)
)
pause



Код:

Код: Выделить всё

@ECHO OFF
SetLocal enabledelayedexpansion
SET UNISTALL=HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall
FOR /f "tokens=7 delims=\" %%a IN ('reg query "%UNISTALL%"') DO (
        FOR /f "tokens=1,2*" %%b IN ('reg query "%UNISTALL%\%%a" ^| FIND /I "HelpLink"') DO (
set "tt=%%d"
if /i "!tt:~7,21!"=="support.microsoft.com" (
set "up2=!tt:~-9!"
if /i "!up2:~0,2!"=="d=" set "up2=KB!up2:~2!"
if /i "!up2:~0,1!"=="=" set "up2=KB!up2:~1!"
if /i "!up2:~0,3!"=="id=" set "up2=KB!up2:~3!"
if /i "!up2:~0,3!"=="kb/" set "up2=KB!up2:~3!"
if /i "!up2:~6,2!"=="-v" set "up2=KB!up2:~0,-3!"
if /i "!up2:~0,4!"=="KBKB" set "up2=!up2:~2!"
echo !up2!
)
        )
)
pause
Аватара пользователя
sov44

Re: CMD/BAT - Список обновлений KB

Сообщение sov44 »

Слепил всё в один файл. Осталось убрать дублирование некоторых записей.



Код:

Код: Выделить всё

@ECHO OFF
SetLocal enabledelayedexpansion
SET UNISTALL=HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall
FOR /f "tokens=7 delims=\" %%a IN ('reg query "%UNISTALL%"') DO (
FOR /f "tokens=1,2*" %%b IN ('reg query "%UNISTALL%\%%a" 2^>nul ^| FIND /I "HelpLink"') DO (
set "tt=%%d"
if /i "!tt:~7,21!"=="support.microsoft.com" (
set "up2=!tt:~-9!"
if /i "!up2:~0,2!"=="d=" set "up2=KB!up2:~2!"
if /i "!up2:~0,1!"=="=" set "up2=KB!up2:~1!"
if /i "!up2:~0,3!"=="id=" set "up2=KB!up2:~3!"
if /i "!up2:~0,3!"=="kb/" set "up2=KB!up2:~3!"
if /i "!up2:~6,2!"=="-v" set "up2=KB!up2:~0,-3!"
if /i "!up2:~0,4!"=="KBKB" set "up2=!up2:~2!"
if /i "!up2:~0,2!"=="b/" set "up2=KB!up2:~2!"
::echo !up2!
call :fn1 !up2!
)
)
 FOR /f "tokens=1,2*" %%b IN ('reg query "%UNISTALL%\%%a" 2^>nul ^| Find "REG_SZ"') DO (
set "zz=%%d"
if /i "!zz:~0,2!"=="KB" (
if /i "!zz:~-2!"=="v2" set "zz=!zz:~0,-2!"
set "up3=!zz!"
::echo !up3!
call :fn1 !up3!
)
)
)
pause
:fn1
set "update=%1"
Echo %update%

Надеюсь на помощь...
Аватара пользователя
El Sanchez

Re: CMD/BAT - Список обновлений KB

Сообщение El Sanchez »

Цитата sov44:



Устанавливать только те, которых нет в системе.
CMD/BAT - Список обновлений KB




Выдрал кусок из своего рабочего обновлятора. В примере обновления (только системные; IE, WMP требуют другого разбора) и скрипт находятся в одной директории, для боеготовности удалить Echo:



Код:

Код: Выделить всё

@Echo Off
For /F "Tokens=1-4* Delims=-" %%A in ('Dir /B "*.exe"') Do Call :_Func "%%A" "%%B" "%%C" "%%D" "%%E"
GoTo :EoF
:_Func
Set Version=%~3
If /i "!Version:~0,1!"=="v" (Set UpdNameVer=%~2-%~3) Else (Set UpdNameVer=%~2)
Reg Query "HKLM\Software\Microsoft\Updates" /s 2>nul|Find /i "%UpdNameVer%" 1>nul 2>&1||^
Reg Query "HKLM\Software\Microsoft\Windows NT\CurrentVersion\HotFix" /s 2>nul|Find /i "%UpdNameVer%" 1>nul 2>&1||^
If /i %5=="" (Echo Start /Wait %~1-%~2-%~3-%~4 /quiet /norestart) Else (Echo Start /Wait %~1-%~2-%~3-%~4-%~5 /quiet /norestart)
Аватара пользователя
sov44

Re: CMD/BAT - Список обновлений KB

Сообщение sov44 »

El Sanchez, спасибо за скрипт и за наводку по месторасположению обновлений. Одно осталось не решенным в моём скрипте - убрать повторы выводов обновлений.
Аватара пользователя
sov44

Re: CMD/BAT - Список обновлений KB

Сообщение sov44 »

После установки обновлений Office 2010, выяснил, что информация об их установке ( не всех, а только некоторых) прописывается только в

Код:

Код: Выделить всё

HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall

В связи с этим попытался объединить свой скрипт и скрипт El Sanchez.
читать дальше »




Код:

Код: Выделить всё

@Echo Off
SetLocal enabledelayedexpansion
Echo.
Echo                   Установка обновлений
Echo Если обновления есть в системе, их установка не производится
Echo.
For /F "Tokens=1-4* Delims=-" %%A in ('dir /b /od "*.exe"') Do Call :fn1 "%%A" "%%B" "%%C" "%%D" "%%E"
SET UNISTALL=HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall
FOR /f "tokens=7 delims=\" %%a IN ('reg query "%UNISTALL%"') DO (
FOR /f "tokens=1,2*" %%b IN ('reg query "%UNISTALL%\%%a" 2^>nul ^| FIND /I "HelpLink"') DO (
set "tt=%%d"
if /i "!tt:~7,21!"=="support.microsoft.com" (
set "up2=!tt:~-9!"
if /i "!up2:~0,2!"=="d=" set "up2=KB!up2:~2!"
if /i "!up2:~0,1!"=="=" set "up2=KB!up2:~1!"
if /i "!up2:~0,3!"=="id=" set "up2=KB!up2:~3!"
if /i "!up2:~0,3!"=="kb/" set "up2=KB!up2:~3!"
if /i "!up2:~6,2!"=="-v" set "up2=KB!up2:~0,-3!"
if /i "!up2:~0,4!"=="KBKB" set "up2=!up2:~2!"
if /i "!up2:~0,2!"=="b/" set "up2=KB!up2:~2!"
call :fn1 !up2!
)
)
 FOR /f "tokens=1,2*" %%b IN ('reg query "%UNISTALL%\%%a" 2^>nul ^| Find "REG_SZ"') DO (
set "zz=%%d"
if /i "!zz:~0,2!"=="KB" (
if /i "!zz:~-2!"=="v2" set "zz=!zz:~0,-2!"
set "up3=!zz!"
call :fn1 !up3!
)
)
)
pause
GoTo :EoF
:fn1
Set Version=%~3
set "n=%~1"
set "update=%1"
If /i "!Version:~0,1!"=="v" (Set UpdNameVer=%~2-%~3) Else (Set UpdNameVer=%~2)
if /i not "KB%UpdNameVer:~2%"=="update=%1" (
If /i %5=="" (
Echo Установка обновления %n%  -  KB%UpdNameVer:~2%
start /Wait %~1-%~2-%~3-%~4 /quiet /norestart
) Else (
Echo Установка обновления %n%  -  KB%UpdNameVer:~2%
start /Wait %~1-%~2-%~3-%~4-%~5 /quiet /norestart
)
)





При объединении, в скрипте появилась ошибка. Прошу подсказать, как её исправить.
Аватара пользователя
sov44

Re: CMD/BAT - Список обновлений KB

Сообщение sov44 »

Всё ещё актуально! Как объединить скрипты?
Аватара пользователя
Devils0411

Re: CMD/BAT - Список обновлений KB

Сообщение Devils0411 »

Подскажите в такой ситуации.



Код:

Код: Выделить всё

@Echo off
SetLocal enabledelayedexpansion
if exist "%ProgramFiles(x86)%" (set bit=x64) else (set bit=x86)
Title Поиск отсутствующих обновлений для Windows %bit%
wmic qfe get HotFixID >temp.txt
.\iconv\iconv -c -f UTF-16LE -t CP866 temp.txt > ListUpdated.txt
del /S /Q temp.txt >nul
For /F "Tokens=1-3* Delims=-" %%a in ('Dir /B ".\%bit%\*.msu"') Do Call :matching %%a %%b %%c %%d
goto :EOF
:matching
for /f "Tokens=1 Delims= " %%e in ('FindStr /IB "%2" "ListUpdated.txt"') do set upd=%%e
if "%2"=="%upd%" (echo Обновление %2 присутствует в системе.>>%~n0.log)

Данный код, проверяет, установлено ли обновление, которое находится в папке %bit%, в системе или нет. А нужно наоборот, если ли в папке %bit% обновление, которое установлено в системе, или нет?
Ответить

Вернуться в «Скриптовые языки администрирования Windows»