Исправленный и дополненный 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-архиве).