Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Аватара для YuriPet

Ветеран


Сообщения: 1417
Благодарности: 342

Профиль | Отправить PM | Цитировать


Я тут того...
Быстренько скомбинировал "один из двух" (от 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

-------

Моим первым "персональным компьютером" был(а) "МИР-1"!


Последний раз редактировалось YuriPet, 25-10-2006 в 09:18. Причина: Учтено замечание [b]Sanja Alone[/b]

Это сообщение посчитали полезным следующие участники:

Отправлено: 09:48, 24-10-2006 | #81