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

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

Аватара для Sanja Alone

Ищу Человека…


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

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


Исправленный и дополненный oeminfo.cmd

ВНИМНИЕ! Последняя версия oeminfo.cmd отныне находится здесь

Собственно, это мой старый вариант, объединенный с методом "CatRoot", предложенным ANDYru более года назад в теме Добавление OEM информации и реализованным YuriPet-ом на базе доработанного мною первоначального варианта oeminfo.cmd c MSFN (вроде никого не забыл ).

Что изменилось:
  • Теперь код работоспособен на любом этапе установки ОС (проблемы с cmdlines.txt решены).
  • При ненахождении маркерного файла, переменная CDROM устанавливается равной пути запуска файла oeminfo.cmd без 7 последних символов \$OEM$\ (в кач-ве альтернативы, можно было бы брать путь из параметра SourcePath в реестре, но этот способ менее универсален). В данном сл. для составления списка обновлений исп-ся метод "CatRoot".
  • Записи в "Сведениях о поддержке" теперь соотв. языку локали ОС.
  • В конце строки "Установленные компоненты и обновления" ("Installed Components and Updates") в скобках отображается общее к-во апдейтов (соот-щих маске).
  • Серийник по ум. видим.
  • Оптимизирован цикл определения CDROM-а (CDROM-ом считается первый найденный дисковод с маркерным файлом).

! Внимание !
Весь выделенный красным текст должен быть в кодировке ANSI (CP1251), синим - OEM (CP866), зеленым - не важно (это просто комментарии).
Коричневым цветом я выделил те переменные, к-рые Вам захочется или понадобится (возможно) изменить.

Код: Выделить весь код
@echo off

rem магические слова :)
setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION

rem <--- ОБЪЯВЛЕНИЕ ПЕРЕМЕННЫХ --->
rem полный путь и имя файла oeminfo
set OEMFILE=%SYSTEMROOT%\system32\oeminfo.ini
rem маркерный файл для определения cdrom-а
set TAGFILE=WIN51
rem производитель
set MANUFACTURER=Sanja Alone
rem модель
set MODEL=Unattended XP DVD
rem кол-во апдейтов в одной строке (по ум. 6)
set UPMAX=6
rem вписывать или нет серийник в файл oeminfo (1 - да; 0 - нет)
set KEY=1
rem сделать ли видимым серийник в окне "Сведения о поддержке" (1 - да; 0 - нет)
set KEYISVISIBLE=1
rem присвоение переменной CDROM буквы cdrom-а, определенной по маркерному файлу
rem (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
rem каталог с апдейтами и маска для отбора файлов в каталоге апдейтов (*.* - все; *.cat - только каталоги безопасности; KB*.* - только начинающиеся с KB и т.п.)
if defined CDROM (
	set UPDATESDIR=%CDROM%\I386\SVCPACK
	set UPDATESMASK=*.*
) else (
	rem определяем переменную CDROM как каталог на HDD
	rem (если файл oeminfo.cmd у Вас будет не в каталоге $OEM$, 
	rem то измените число обрезаемых от переменной справа символов с 7 на требуемое Вам)
	set CDROM=%~dp0
	set CDROM=!CDROM:~0,-7!
	set UPDATESDIR=%SYSTEMROOT%\system32\CatRoot\{F750E6C3-38EE-11D1-85E5-00C04FC295EE}
	set UPDATESMASK=KB*.*
	rem Снимаем атрибуты файлов
	attrib -H -S !UPDATESDIR!\!UPDATESMASK!
)
rem Обеспечение правильности отработки мультизагрузочного CD/DVD
if exist %CDROM%\I386\winn1.sif (
	set WINNTSIF=%CDROM%\I386\winn1.sif
) else (
	if exist %CDROM%\I386\winnt.sif (
		set WINNTSIF=%CDROM%\I386\winnt.sif
	)
)
rem <--- ОКОНЧАНИЕ ОБЪЯВЛЕНИЯ ПЕРЕМЕННЫХ --->

rem язык ОС (419 - рус.)
rem !ВАЖНО! - в кач-ве разделителя нужно указать только символ табуляции 
rem (ASCII-код символа после знака "равно" должен быть 09)
for /F "tokens=3 delims=	" %%j in ('reg query "HKEY_CURRENT_USER\Control Panel\International" /v Locale') do (set lang=%%j)

rem Т.к. используется символ ">", то существующий файл oeminfo.ini будет перезаписан;
rem т.о. нет нужды его предварительно удалять
echo [General]> "%OEMFILE%"
echo Manufacturer=%MANUFACTURER%>> "%OEMFILE%"
echo Model=%MODEL%>> "%OEMFILE%"

rem Достаем из winnt.sif (winn1.sif) серийный номер
rem Это работает независимо от вида записи ProductKey=XXXX или ProductKey = 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
)

rem Определение общего кол-ва файлов в каталоге апдейтов соотв-щих маске (для рус. и англ. Windows)
for /F "usebackq tokens=1" %%m in (`dir %UPDATESDIR%\%UPDATESMASK% ^| find /i "file(s)"`) do (set numfiles=%%m)
if not defined numfiles (
for /F "usebackq tokens=1" %%m in (`dir %UPDATESDIR%\%UPDATESMASK% ^| find /i "файлов"`) do (set numfiles=%%m)
)

rem Дата и время инсталляции ОС в формате DD.MM.YYYY (hh:mm), например 20.05.2005 (14:37)
if %lang% == 00000419 (
	echo Line%i%=Дата и время установки ^(обновления^): %date% ^(%time:~0,-6%^)>> "%OEMFILE%"
) else (
	echo Line%i%=Installation ^(updation^) date and time: %date% ^(%time:~0,-6%^)>> "%OEMFILE%"
)
set /A i+=1
echo Line%i%=>> "%OEMFILE%"
set /A i+=1
if %lang% == 00000419 (
	echo Line%i%=Установленные компоненты и обновления ^(%numfiles%^):>> "%OEMFILE%"
) else (
	echo Line%i%=Installed Components and Updates ^(%numfiles%^):>> "%OEMFILE%"
)
set /A i+=1
echo Line%i%=>> "%OEMFILE%"
set /A i+=1

rem вспомогательные переменные
set l=0
set c=0

rem Список апдейтов (имена всех файлов без расширений)
rem (без ключевого слова usebackq команда dir будет воспринята как 
rem имя файла для подстановки в цикл FOR с последующей выдачей сообщения 
rem об отсутствии такого файла в текущем каталоге).
for /F "usebackq tokens=1 delims=." %%j in (`dir /B %UPDATESDIR%\%UPDATESMASK%`) do ((set kbname=%%j) & (call :myprint))

rem Возвращаем атрибуты файлов
if %UPDATESDIR% == %SYSTEMROOT%\system32\CatRoot\{F750E6C3-38EE-11D1-85E5-00C04FC295EE} (
	attrib +S %UPDATESDIR%\%UPDATESMASK%
)
rem Выход из этого пакетного файла.
rem Команда GOTO принимает в качестве метки перехода строку :EOF, которая вызывает
rem передачу управления в конец текущего пакетного файла. Это позволяет легко
rem выйти из пакетного файла без определения каких-либо меток. (из справки по goto)
goto :EOF

:myprint
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=numfiles-l*UPMAX
) else (
	if %numfiles% LSS %UPMAX% (
		if !c! == %numfiles% (
			echo Line%i%=!str!>> "%OEMFILE%"
		)
	)
	if !tmp! LSS %UPMAX% (
		if !c! == !tmp! (
			echo Line%i%=!str!>> "%OEMFILE%"
		)
	)
)
Приведенный выше файл с правильными кодировками здесьrar-архиве).

-------
Sanja Alone's site (ConvRegToAU3, OEsr, RSA, AutoIt скрипты)


Последний раз редактировалось Sanja Alone, 10-10-2006 в 03:34. Причина: Обновление

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

Отправлено: 23:06, 11-09-2006 | #48