Я тут того...

Быстренько скомбинировал "
один из двух" (от
Sanja Alone и
alcos)
Код:

@echo off
::Магические слова :)
setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
::<----- ОБЪЯВЛЕНИЕ ПЕРЕМЕННЫХ ----->
::Расположение временных файлов
set HF=%SystemDrive%
::Полный путь и имя файла oeminfo
set OEMFILE=%SYSTEMROOT%\system32\oeminfo.ini
::Производитель
set MANUFACTURER=YuriPet
::Количество обновлений в одной строке (по ум. 6)
set UPMAX=6
::Вписывать или нет серийник в файл oeminfo (1 - да; 0 - нет)
set KEY=1
::Сделать ли видимым серийник в окне "Сведения о поддержке" (1 - да; 0 - нет)
set KEYISVISIBLE=0
::Маркерный файл для определения CDROM-а
set TAGFILE=WIN51
::Присвоение переменной CDROM буквы CDROM-а, определенной по маркерному файлу
for %%d in (c d e f g h i j k l m n o p q r s t u v w x y z) do if exist %%d:\%TAGFILE% set CDROM=%%d:&& goto metka
:metka
::Обеспечение правильности отработки мультизагрузочного CD/DVD
if exist %CDROM%\I386\winna.sif (
set WINNTSIF=%CDROM%\I386\winna.sif
) else (
if exist %CDROM%\I386\winnt.sif (
set WINNTSIF=%CDROM%\I386\winnt.sif
)
)
::Определяем язык ОС (419 - рус.)
::!ВАЖНО! - в кач-ве разделителя нужно указать только символ табуляции
::(ASCII-код символа после знака "равно" должен быть 09)
for /F "tokens=3 delims= " %%j in ('reg query "HKEY_CURRENT_USER\Control Panel\International" /v Locale') do (set lang=%%j)
::<----- ОКОНЧАНИЕ ОБЪЯВЛЕНИЯ ПЕРЕМЕННЫХ ----->
::Удаление существующих файлов с именами, совпадающими с теми, что используются в качестве временных
if exist %HF%\Prog.txt del %HF%\Prog.txt
if exist %HF%\Updates.txt del %HF%\Updates.txt
::Считываем всю строку (usebackq - без кавычек) ключа "BuildLab" из реестра и присваеваем её переменной "BUILD"
FOR /F "usebackq tokens=* delims==" %%i IN (`REG QUERY "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v BuildLab`) do set BUILD=%%i
::Т.к. используется символ ">", то существующий файл oeminfo.ini будет перезаписан;
::т.о. нет нужды его предварительно удалять
echo [General]> "%OEMFILE%"
if %lang% == 00000419 (
echo Manufacturer=Установил: %MANUFACTURER%>> "%OEMFILE%"
echo Model=Сборка: %BUILD:~-21%>> "%OEMFILE%"
) else (
echo Manufacturer=Manufacturer: %MANUFACTURER%>> "%OEMFILE%"
echo Model=Build: %BUILD:~-21%>> "%OEMFILE%"
)
::Достаем из winnt.sif (winna.sif) серийный номер
::Это работает независимо от вида записи ProductKey=XXXX или ProductKey = XXXX (с пробелами)
::Если номер не будет виден в окне "Сведения о поддержке"
::то в файле oeminfo.ini номер будет в строке SerialNo=XXXX
if defined WINNTSIF (
if %KEY% == 1 (
for /F "tokens=3 delims==] " %%j in ('find /I /N "ProductKey" %WINNTSIF%') do (
if %KEYISVISIBLE% == 1 (
echo [Support Information]>> "%OEMFILE%"
if %lang% == 00000419 (
echo Line1=Ключ продукта: %%j>> "%OEMFILE%"
) else (
echo Line1=Product Key: %%j>> "%OEMFILE%"
)
echo Line2=>> "%OEMFILE%"
set i=3
) else (
echo [OEMSpecific]>> "%OEMFILE%"
echo SerialNo=%%j>>"%OEMFILE%"
echo [Support Information]>> "%OEMFILE%"
set i=1
))
) else (
echo [Support Information]>> "%OEMFILE%"
set i=1
)
) else (
echo [Support Information]>> "%OEMFILE%"
set i=1
)
::Произвольная информация, для отображения в окне "Сведения о поддержке"
echo Line%i%=Установлена операционная система Windows XP Professional>> "%OEMFILE%"
set /A i+=1
echo Line%i%=с интегрированным Service Pack 2, и последующиими пакетами>> "%OEMFILE%"
set /A i+=1
echo Line%i%=обновлений системы защиты и программного обеспечения.>> "%OEMFILE%"
set /A i+=1
echo Line%i%=>> "%OEMFILE%"
set /A i+=1
::Считываем из реестра наименования установленных программ и обновлений и выводим во временный файл Prog.txt
for /F "usebackq tokens=7 delims=\" %%z IN (`REG QUERY "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"`) do echo %%z >> %HF%\Prog.txt
::Выделяем из файла Prog.txt обновления (с именем "KB*") и выводим во временный файл Updates.txt
for /F "usebackq eol=! tokens=*" %%g IN (`find /i "KB" %HF%\Prog.txt`) do echo %%g >> %HF%\Updates.txt
::Считываем из реестра информацию о "DotNetFx 1.1" и дописываем в файл Updates.txt
for /F "usebackq eol=! tokens=7* delims=\" %%y IN (`REG QUERY "HKLM\SOFTWARE\Microsoft\Updates\.NETFramework\1.1"`) do @call :prov "%%y"
::Считываем из реестра информацию о "DotNetFx 2.0" и дописываем в файл Updates.txt
for /F "usebackq eol=! tokens=7* delims=\" %%k IN (`REG QUERY "HKLM\SOFTWARE\Microsoft\Updates\Microsoft .NET Framework 2.0"`) do @call :prov1 "%%k"
::Считываем из реестра информацию о "MSXML 6.0 Parser (KB925673)" и дописываем в файл Updates.txt
for /F "usebackq tokens=* delims==" %%r IN (`REG QUERY "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{031816E0-7ED4-4F9B-986D-CE9E1A1CC6E5}" /v DisplayName`) do set PS=%%r
echo %PS:~-9,8% >> %HF%\Updates.txt
::Считываем из реестра информацию о "Клиент управления правами Windows (KB839178)" и дописываем в файл Updates.txt
FOR /F "usebackq tokens=* delims==" %%r IN (`REG QUERY "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{B820A362-C3CF-411F-880B-9BF5E992B25E}" /v HelpLink`) do set CL=%%r
echo KB%CL:~-6,8% >> %HF%\Updates.txt
::Определяем общее количество обновлений
set numupd=0
for /F "usebackq skip=1 tokens=*" %%n IN (%HF%\Updates.txt) do set /A numupd+=1
::Дата инсталляции ОС (обновления) в формате DD.MM.YYYY, например 20.05.2005
if %lang% == 00000419 (
echo Line%i%=Дата установки ^(обновления^): %date%>> "%OEMFILE%"
) else (
echo Line%i%=Installation ^(updation^) date: %date%>> "%OEMFILE%"
)
set /A i+=1
echo Line%i%=>> "%OEMFILE%"
set /A i+=1
if %lang% == 00000419 (
echo Line%i%=Установлены обновления ^(%numupd%^):>> "%OEMFILE%"
) else (
echo Line%i%=Installed Updates ^(%numupd%^):>> "%OEMFILE%"
)
set /A i+=1
echo Line%i%=>> "%OEMFILE%"
set /A i+=1
::вспомогательные переменные
set l=0
set c=0
::Считываем с файла "Updates.txt" строки и передаём их переменной "kbname1" в тело цикла через переменную "j"
FOR /F "usebackq skip=1 tokens=*" %%j IN (%HF%\Updates.txt) do ((set kbname1=%%j) & (call :myprint))
del /q %HF%\Prog.txt
del /q %HF%\Updates.txt
goto :EOF
:myprint
set kbname=%kbname1:~0,8%
if !c! == 0 (
set str=!kbname!
) else (
set str=!str! !kbname!
)
set /A c+=1
if !c! == %UPMAX% (
echo Line%i%=!str!>> "%OEMFILE%"
set /A i+=1
set /A l+=1
set str=
set c=0
set /A tmp=numupd-l*UPMAX
) else (
if %numupd% LSS %UPMAX% (
if !c! == %numupd% (
echo Line%i%=!str!>> "%OEMFILE%"
)
)
if !tmp! LSS %UPMAX% (
if !c! == !tmp! (
echo Line%i%=!str!>> "%OEMFILE%"
)
)
)
goto :eof
:prov1
set k=%~1
echo %k% >> %HF%\Updates.txt
:prov
set u=%~1
echo KB%u:~-6% >> %HF%\Updates.txt