Доработанный вариант файла
oeminfo.cmd- для удобства редактирования "под себя" все значимые переменные вынесены в "шапку"
- кол-во апдейтов в одной строке теперь можно задать любое (переменная UPMAX; по ум. 6)
- запись серийника (переменная KEY) в oeminfo.ini в двух вариантах (видимом KEYISVISIBLE=1 и невидимом KEYISVISIBLE=0), и только при наличии файла winn?.sif
! Внимание ! На этапе T-12 (
cmdlines.txt) фрагмент кода, формирующий список апдейтов
НЕ РАБОТАЕТ. Почему? - объяснить не могу (расширенная обработка команд включена по ум. и вроде все должно работать). На загруженной системе и при вызове из секции
[GuiRunOnce] файла
winnt.sif - все
ОК (из секции
[SetupParams] на Т-9 не проверял).
Код:

@echo off
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 кол-во апдейтов в одной строке
set UPMAX=6
rem вписывать или нет серийник в файл oeminfo (1 - да; 0 - нет)
set KEY=1
rem сделать ли видимым серийник в окне "Сведения о поддержке" (1 - да; 0 - нет)
set KEYISVISIBLE=0
rem присвоение переменной 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:
rem каталог с апдейтами
set UPDATESDIR=%CDROM%\I386\SVCPACK
rem маска для отбора файлов в каталоге апдейтов (*.* - все; *.cat - только каталоги безопасности; KB*.* - только начинающиеся с KB и т.п.)
set 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 Т.к. используется символ ">", то существующий файл 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%"
echo Line1=ProductKey: %%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 Дата и время инсталляции ОС в формате DD.MM.YYYY (hh:mm), например 20.05.2005 (14:37)
echo Line%i%=Installation Date and Time: %date% (%time:~0,-6%)>> "%OEMFILE%"
set /A i+=1
echo Line%i%=>> "%OEMFILE%"
set /A i+=1
echo Line%i%=Installed Components and Updates:>> "%OEMFILE%"
set /A i+=1
echo Line%i%=>> "%OEMFILE%"
set /A i+=1
rem Определение общего кол-ва файлов в каталоге апдейтов соотв-щих маске (для рус. и англ. Винды)
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 вспомогательные переменные
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 Выход из этого пакетного файла.
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%"
)
)
)