Sanja Alone
Твоя конструкция
Код:

rem Обеспечение правильности отработки мультизагрузочного CD/DVD
if exist "%CDROM%\I386\winn?.sif" (
set WINNTSIF=%CDROM%\I386\winn?.sif
) else (
if defined REGEXE (
for /F "tokens=3 delims= " %%j in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v SourcePath') do set SrcP=%%j
) else (
for /F "tokens=3 delims= " %%j in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v SourcePath') do set SrcP=%%j
)
if exist "!SrcP!\winn?.sif" set WINNTSIF=!SrcP!\winn?.sif
)
для определения пути к дистрибутиву слишком громоздкая и не срабатывает, если в системе стоит два CDROM-а. Определяется путь для переменной например: !SrcP!=D:\WinDistr\1XP1\i386 вместо !SrcP!=E:\WinDistr\1XP1\i386, получается, что первые два символа не заменяются на букву CDROM-а, куда на данный момент вставлен диск и естественно путь получается неверный, соответственно CD-KEY не считывается.
Для чего сделана привязка "Определение версии REG.EXE" к версии файла при определении пути к "winn?.sif" да и далее тоже, я так и не понял, они что по разному инфу с реестра читают или есть другие нюансы? Просто у меня нет английской винды и я этого не знаю. Ведь в реестре путь к i386 прописан в любой винде по ненашему. Сейчас столкнулся с тем, что в реестре путь к дистрибутиву не прописался на виртуалке, может просто из за сбоя, который произошёл у меня.
Я для себя выбрал мой вариант определения, мне кажется, что так проще и всё работает.
Код:

::Считываем всю строку ключа "SourcePath" из реестра и присваеваем её переменной "WINNTSIF"
for /F "usebackq tokens=3 delims= " %%i in (`REG QUERY "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v SourcePath`) do set WINNTSIF=%%i
set WINNTSIF=%WINNTSIF:~2%
::Обеспечение правильности отработки мультизагрузочного CD/DVD
if exist %CDROM%%WINNTSIF%\winn?.sif (
set WINNTSIF=%CDROM%%WINNTSIF%\winn?.sif
)
Есть ещё одна проблема с правильным определением даты и времени установки системы. Если файл "Oeminfo.cmd" запускается при установке системы, то с этим всё правильно, но, если вы запускаете этот файл на уже давно установленной системе (например после обновления), то и дата и время прописываются сегодняшние, т.е. те, которые на момент запуска установлены в системе. Это есть неправильно. Я тут порылся в реестре и нашёл пару мест с правильными (неизменяемыми) необходимыми данными. Родной параметр даты установки в реестре зашифрован (InstallDate=0х44913fe3(1150369763)), пришлось искать другой подходящий.
Код:

::Считываем дату установки системы
for /F "tokens=3 delims= " %%j in ('reg query "HKLM\SOFTWARE\Microsoft\WBEM\CIMOM" /v SetupDate') do set DT=%%j
::Считываем время установки системы (тут время в GMT прописано, надо тоже пересчёт сделать)
for /F "tokens=3 delims= " %%j in ('reg query "HKLM\SOFTWARE\Microsoft\WBEM\CIMOM" /v SetupTime') do set TM=%%j
::Считываем дату установки последнего обновления (это просто пример, реально надо вычислять)
for /F "tokens=3 delims= " %%j in ('reg query "HKLM\SOFTWARE\Microsoft\Updates\Windows XP\SP3\KB873339" /v InstalledDate') do set UD=%%j
Проблема возникает с вычислением даты последнего установленного обновления. Даты прописываются только в ветке
Код:

HKLM\SOFTWARE\Microsoft\Updates\Windows XP\SP3
У меня маловато знаний для того, чтобы из кучи обновлений выбрать самую последнюю дату установки. Вот я и предлагаю знающим (Sanja Alone) идею. Возникает вопрос, а как программы типа Everest и им подобные дату установки вычисляют и ключ продукта?
Один выделенный момент в строке
Код:

echo [Support Information]>> "%OEMFILE%"
if %lang% == 00000419 (
echo Line!i!=%PN% Professional VLK v%CV% %CSDV% >> "%OEMFILE%"
set /A i+=1
echo Line!i!=Версия сборки: %BUILD% >> "%OEMFILE%"
) else (
echo Line!i!=OS:%PN:Microsoft=% %CSDV:Service Pack=SP% version %CV% build %BUILD%>> "%OEMFILE%"
)
Если убрать пробел перед стрелками >>, то вообще ничего в файл "oeminfo.ini" не выводится для дополнительного окна и кнопка естественно отсутствует!
По прежнему отсутствуют в списке:
MSXML 6.0 Parser (KB925673)
Клиент управления правами Windows (KB839178)
Прячутся тут
Код:

::Считываем из реестра информацию о "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 SP2 (KB917275)" и дописываем в файл Updates.txt
for /F "usebackq tokens=* delims==" %%r in (`REG QUERY "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{B67DDF3E-93B1-413A-8AB1-72FF48F4CBFE}" /v HelpLink`) do set CL=%%r
echo KB%CL:~-6,8% >> %HF%\Updates.txt
Приведу пример последнего файлика от Sanja Alone немного подправленного и изменённого лично для себя, мне такое оформление больше нравится. Английский вариант я не изменял.