Ссылки на обновленный сборник в шапке. Добавлено: Обновленный скрипт (от 19.04.2011) для сборника обновлений [more=тут...]
Скрипт подходит, как для русскоязычной системы, так и для англоязычной (корректно определяет версию и язык операционной системы заданные в OS_ver.txt, даже при наличии MUI, при несоответствии выводится соответствующее сообщение, язык вывода информационных сообщений (англ. или рус.) зависит от выбранной кодовой страницы в системе). Скрипт также рассчитан на установку .Net Framework 3.5 SP1 с последними обновлениями, удаление ярлыков IE с рабочего стола и панели быстрого запуска, установку библиотек VC++, если данные функции не нужны, их можно пропустить удалив или не создавая папки dotnetfx35, IE и VC++ (скрипт проверяет их наличие, в случае отсутствия пропускает их установку и переходит к следующей выполняемой строке)
Архив с готовым скриптом, файлами конфигурации, необходимыми утилитами и файлами реестра тут... Ссылка на cборники официальных обновлений для Windows XP (32-bit/64-bit) (19.04.2011/26.12.2010)
с возможностью выбора скачиваемых обновлений, их языка, а также инструментами для удобной синхронизации файлов с текущей версией сборника,
теперь нет необходимости перекачивать одно и тоже каждый месяц: Torrent-link (регистрация не требуется)
Пример текста основного скрипта (сохранить можно, например, как Setup.cmd)... Код: @echo off
rem --- Script from
http://technicskuzya.narod.ru ---
SetLocal EnableExtensions
SetLocal EnableDelayedExpansion
rem ---Считываем файлы конфигурации Set.txt, OS_ver.txt, Text_ru.txt(Text_en.txt) из папки Config---
for /F "tokens=*" %%s in (.\Config\Set.txt) do set %%s
for /F "tokens=*" %%s in (.\Config\OS_ver.txt) do set %%s
(if "%Chk_Lang%"=="Russian" set Chk_Lang3=%Chk_Lang1%)&(if "%Chk_Lang%"=="English" set Chk_Lang3=%Chk_Lang2%)
for /f "tokens=3" %%c in ('reg query "%detect_CP%" /v OEMCP^|findstr /I /C:"OEMCP"') do if "%%c"=="866" (set text_lang=Text_ru.txt) else (set text_lang=Text_en.txt)
for /F "tokens=*" %%s in (.\Config\%text_lang%) do set %%s
rem ---Определяем нужно ли выводить информационные сообщения и сигналы---
if /I %ShowMsg%==Yes (set RemShowMsg= ) else (set RemShowMsg=rem)
rem ---Задаем заголовок окна CMD---
Title %Title_Cmd%
rem ---Скрываем окно CMD по заголовку---
start /WAIT /MIN .\Tools\nircmd.exe win hide title "%Title_Cmd%"
%delay%
rem ---Вызываем процедуру проверки соответствия версии и языка операционной системы---
call :chk
rem ---Выводим информационное сообщение о начале установки обновлений поверх всех окон со звуковым оповещением---
%RemShowMsg% start .\Tools\nircmd.exe infobox %Text_InfoBox_2% %Title_InfoBox%
%RemShowMsg% start /WAIT /MIN .\Tools\nircmd.exe beep 1500 2000
%RemShowMsg% start /WAIT /MIN .\Tools\nircmd.exe win settopmost title %Title_InfoBox% 1
rem ---Делаем запись даты и времени выполнения скрипта в журналы Installed_Updates.log и Detected_Updates.log---
echo Date of installation: %time:~,-6% %date%>>%SystemDrive%\Installed_Updates.log&echo Date of detection: %time:~,-6% %date%>>%SystemDrive%\Detected_Updates.log
echo.>>%SystemDrive%\Installed_Updates.log&echo.>>%SystemDrive%\Detected_Updates.log
rem ---Включаем отображение расширений файлов в проводнике (только если существует файл HideFileExt.reg в папке Tools)---
if exist .\Tools\HideFileExt.reg start /high /wait regedit /s .\Tools\HideFileExt.reg
rem ---Отключаем службу восстановления системы (только если существует файл DisableSR.reg в папке Tools)---
if exist .\Tools\DisableSR.reg (
start /high /wait regedit /s .\Tools\DisableSR.reg
start /high /wait sc stop srservice >nul
)
rem ---Вызываем процедуру установки Microsoft .Net Framework 3.5 SP1 Rus---
if /I %Install_NET_35%==Yes (call :dotnetfx35)
rem ---Вызываем процедуру установки Microsoft .Net Framework 4.0 Rus---
if /I %Install_NET_40%==Yes (call :dotnetfx40)
rem ---Для каждой не пустой строки файла KB.txt из папки Config вызываем процедуру :KBInst---
for /F "tokens=1,* delims= " %%k in (.\Config\KB.txt) do call :KBInst "%%k" "%%l"
rem ---Если установлено обновление KB890830 создаем ярлык (меню Пуск->Программы) для исполняемого файла в папке заданной в файле Text_ru.txt (Text_en.txt)---
if exist "%WINDIR%\System32\MRT.exe" .\Tools\nircmd shortcut "%WINDIR%\System32\MRT.exe" "~$folder.common_programs$\%MRT_Group%" "Microsoft Removal Tool"
rem ---Вызываем процедуру удаления ярлыков Internet Explorer с рабочего стола и панели быстрого запуска---
call :IEclrlnk
rem ---Вызываем процедуру установки Windows Roots Update---
call :rootsupdate
rem ---Вызываем процедуру установки библиотек VC++ 2005 и VC++ 2008---
call :VC++
if exist .\KBxxxxxx\KB905474.exe if exist .\WGA\WGAUpdate.exe start /wait .\WGA\WGAUpdate.exe
rem ---Записываем по две пустые строки в журналы Installed_Updates.log и Detected_Updates.log---
echo.>>%SystemDrive%\Installed_Updates.log&echo.>>%SystemDrive%\Installed_Updates.log&echo.>>%SystemDrive%\Detected_Updates.log&echo.>>%SystemDrive%\Detected_Updates.log
rem ---Распаковываем утилиту nircmd.exe в папку %SystemRoot%\TEMP---
start /WAIT /MIN .\Tools\NirCmdInst.exe
rem ---После перезагрузки выводим информационное сообщение о полном окончании установки---
%RemShowMsg% reg add HKCU\Software\Microsoft\Windows\CurrentVersion\RunOnce /v ReadyPreSP3 /t REG_SZ /d "%SystemRoot%\TEMP\nircmd.exe infobox \"%Text_InfoBox_4%\" \%Title_InfoBox:~,-1%\"" /f >nul
rem ---При наличии файла NGEN.exe выполняем очередь заданий службы оптимизации .Net Framework 4.0
if exist %WinDir%\Microsoft.NET\Framework\v4.0.30319\NGEN.exe (start /B /WAIT %WinDir%\Microsoft.NET\Framework\v4.0.30319\NGEN.exe executequeueditems /silent /nologo)
rem ---Проверяем значение ключа принудительной перезагрузки после окончания установки обновлений---
if /I %ForceReboot%==Yes ( rem ---Выводим информационное сообщение об окончании установки обновлений и предстоящей перезагрузке со звуковым оповещением---
%RemShowMsg% start /WAIT /MIN %SystemRoot%\TEMP\nircmd.exe win close title %Title_InfoBox%
%RemShowMsg% start %SystemRoot%\TEMP\nircmd.exe infobox %Text_InfoBox_3% %Title_InfoBox%
%RemShowMsg% start /WAIT /MIN %SystemRoot%\TEMP\nircmd.exe beep 200 800
rem ---Выполняем перезагрузку после 10 секундной задержки---
start /B %SystemRoot%\TEMP\nircmd.exe cmdwait 10000 exitwin reboot forceifhung
) else (rem ---Выводим информационное сообщение об окончании установки обновлений и необходимости в перезагрузке ---
%RemShowMsg% start /WAIT /MIN %SystemRoot%\TEMP\nircmd.exe win close title %Title_InfoBox%
%RemShowMsg% start %SystemRoot%\TEMP\nircmd.exe infobox %Text_InfoBox_5% %Title_InfoBox%
%RemShowMsg% start %SystemRoot%\TEMP\nircmd.exe beep 200 800
)
exit
rem ===============
rem ===ПРОЦЕДУРЫ===
rem ===============
rem ---Процедура проверки соответствия версии и языка операционной системы---
:chk
rem ---Проверяем версию операционной системы---
for /f "tokens=2*" %%v in ('reg query "%detect_SP%" /v ProductName^|findstr /I /C:"ProductName"') do (
if not "%%w"=="%Chk_OS%" (
%RemShowMsg% start .\Tools\nircmd.exe infobox %Text_InfoBox_0% %Title_InfoBox%
exit
)
)
rem ---Проверяем версию Service Pack операционной системы---
for /f "tokens=5" %%p in ('reg query "%detect_SP%" /v CSDVersion') do (
if not "%%p"=="%Chk_SP:~-1%" (
%RemShowMsg% start .\Tools\nircmd.exe infobox %Text_InfoBox_0% %Title_InfoBox%
exit
)
)
rem ---Проверяем язык операционной системы---
if not exist "%ALLUSERSPROFILE%\%Chk_Lang3%" (
%RemShowMsg% start .\Tools\nircmd.exe infobox %Text_InfoBox_1% %Title_InfoBox%
exit
)
goto :EOF
rem ---Процедура установки Microsoft .Net Framework 3.5 SP1 Rus с проверкой существования папки .\dotnetfx35 и сведений о данной версии в реестре---
:dotnetfx35
if exist .\dotnetfx35 (
reg query "%detect_NET_35%" 1>nul 2>&1
if !ERRORLEVEL!==1 (
%delay%
xcopy .\dotnetfx35\dotnetfx35langpack_x86ru.exe %TEMP%\dotnetfx3530729.01\1033\dotnetfx35\x86\*.exe /Y >nul
start /wait .\dotnetfx35\dotnetfx35.exe %NetSwitches35%
echo dotnetfx35 %NetSwitches35%>>%SystemDrive%\Installed_Updates.log
(%delay%)&(%NetStop20%)
for /f "tokens=3" %%k in ('reg query "%detect_KB954550%" /v Location') do set NetPath=%%~dk%%~pk
rem rd /S /Q "!NetPath:~,-1!"
attrib +h !NetPath:~,-1!
%delay%
) ELSE (echo .NET Framework 3.5 SP1 Rus detected in %detect_NET_35%>>%SystemDrive%\Detected_Updates.log)
reg query "%detect_NET_35%" 1>nul 2>&1
if !ERRORLEVEL!==0 (
reg query "%detect_KB958481%" 1>nul 2>&1
if !ERRORLEVEL!==1 (
start /wait .\dotnetfx35\ndp20sp2-kb958481-x86.exe %NetUpdatesSwitches%
echo KB958481 %NetUpdatesSwitches%>>%SystemDrive%\Installed_Updates.log
(%delay%)&(%NetStop20%)
) ELSE (echo KB958481 detected in %detect_KB958481%>>%SystemDrive%\Detected_Updates.log)
reg query "%detect_KB958483%" 1>nul 2>&1
if !ERRORLEVEL!==1 (
start /wait .\dotnetfx35\ndp30sp2-kb958483-x86.exe %NetUpdatesSwitches%
echo KB958483 %NetUpdatesSwitches%>>%SystemDrive%\Installed_Updates.log
(%delay%)&(%NetStop20%)
) ELSE (echo KB958483 detected in %detect_KB958483%>>%SystemDrive%\Detected_Updates.log)
reg query "%detect_KB958484%" 1>nul 2>&1
if !ERRORLEVEL!==1 (
start /wait .\dotnetfx35\ndp35sp1-kb958484-x86.exe %NetUpdatesSwitches%
echo KB958484 %NetUpdatesSwitches%>>%SystemDrive%\Installed_Updates.log
(%delay%)&(%NetStop20%)
) ELSE (echo KB958484 detected in %detect_KB958484%>>%SystemDrive%\Detected_Updates.log)
)
)
goto :EOF
rem ---Процедура установки Microsoft .Net Framework 4.0 Rus Full с проверкой существования папки .\dotnetfx40 и сведений о данной версии в реестре---
:dotnetfx40
if exist .\dotnetfx40 (
reg query "%detect_NET_40%" 1>nul 2>&1
if !ERRORLEVEL!==1 (
%delay%
start /wait .\dotnetfx40\dotnetfx40_full_x86.exe %NetSwitches40%
echo dotnetfx40_full_x86 %NetSwitches40%>>%SystemDrive%\Installed_Updates.log
(%delay%)&(%NetStop20%)&(%NetStop40%)
) ELSE (echo .NET Framework 4.0 Full detected in %detect_NET_40%>>%SystemDrive%\Detected_Updates.log)
)
if exist .\dotnetfx40 (
reg query "%detect_NET_40_lp%" 1>nul 2>&1
if !ERRORLEVEL!==1 (
%delay%
start /wait .\dotnetfx40\dotnetfx40lp_full_x86ru.exe %NetSwitches40%
echo dotnetfx40lp_full_x86ru %NetSwitches40%>>%SystemDrive%\Installed_Updates.log
(%delay%)&(%NetStop20%)&(%NetStop40%)
) ELSE (echo .NET Framework 4.0 Full Rus detected in %detect_NET_40_lp%>>%SystemDrive%\Detected_Updates.log)
)
goto :EOF
rem ---Процедура для установки обновлений из папки KBxxxxxx перечисленных в KB.txt---
:KBInst
rem ---Имя текущего обновления из файла KB.txt (значение первого параметра переданного данной процедуре) присваиваем переменной number---
set number=%~1
rem ---По умолчанию считаем, что ключи для установки текущего обновления в файле KB.txt не определены---
set UserSwitches=No
rem ---Если в файле KB.txt после имени обновления заданы ключи для установки обновления, присваиваем их переменной UserSwitches---
if not %2=="" set UserSwitches=%~2
rem ---По-умолчанию считаем, что ни одно обновление из папки KBxxxxxx не установлено---
set detect_key=0
rem ---Для "особенных" обновлений выполняем "особенную" проверку на предмет необходимости установки и прерываем выполнение процедуры в случае обнаружения сведений---
if %number%==KB923789 if not exist "%detect_KB923789%" (echo %number% new version of Macromedia Flash already installed>>%SystemDrive%\Detected_Updates.log)&(goto :EOF)
if %number%==KB946648 if not exist "%detect_KB946648%" (echo %number% skipped %detect_KB946648% not exist>>%SystemDrive%\Installed_Updates.log)&(goto :EOF)
if %number:~,3%==IE7 set detect_IE=%detect_IE7%
if %number:~,3%==IE8 set detect_IE=%detect_IE8%
if %number:~,3%==wua if exist "%detect_WUA%" (echo %number% detected in %detect_WUA%>>%SystemDrive%\Detected_Updates.log)&(goto :EOF)
for /F "tokens=1,* delims= " %%b in (.\Config\KBforNetFW35.txt) do (
if %number%==%%b (
reg query "%detect_NET_35%" 1>nul 2>&1
if !ERRORLEVEL!==1 (echo %number% skipped MS .Net Framework 3.5 SP1 not detected>>%SystemDrive%\Installed_Updates.log)&(goto :EOF)
if %number%==KB976569 (
reg query "%detect_KB983583%" 1>nul 2>&1
if !ERRORLEVEL!==0 (echo %number% has already replaced KB983583>>%SystemDrive%\Detected_Updates.log)&(goto :EOF)
)
if %number%==KB982168 (
for /F "tokens=1,* delims= " %%e in (.\Config\KB982168.txt) do (
set number=%%e
for /F "tokens=*" %%l in (.\Config\RegKeys.txt) do (
reg query "%%l" 1>nul 2>&1
if !ERRORLEVEL!==0 (set /a chkKB982168=chkKB982168+1)&(echo !number! from KB982168 detected in %%l>>%SystemDrive%\Detected_Updates.log)
)
)
set number=KB982168
if !chkKB982168!==2 set detect_key=1
)
if %number%==KB982524 (
for /F "tokens=1,* delims= " %%e in (.\Config\KB982524.txt) do (
set number=%%e
for /F "tokens=*" %%l in (.\Config\RegKeys.txt) do (
reg query "%%l" 1>nul 2>&1
if !ERRORLEVEL!==0 (set /a chkKB982524=chkKB982524+1)&(echo !number! from KB982524 detected in %%l>>%SystemDrive%\Detected_Updates.log)
)
)
set number=KB982524
if !chkKB982524!==2 set detect_key=1
)
)
)
for /F "tokens=1,* delims= " %%c in (.\Config\KBforNetFW40.txt) do (
if %number%==%%c (
reg query "%detect_NET_40%" 1>nul 2>&1
if !ERRORLEVEL!==1 (echo %number% skipped MS .Net Framework 4.0 not detected>>%SystemDrive%\Installed_Updates.log)&(goto :EOF)
)
)
if %number%==msxml4 (
reg query "%detect_msxml4%" 1>nul 2>&1
if !ERRORLEVEL!==0 (echo %number% detected in %detect_msxml4%>>%SystemDrive%\Detected_Updates.log)&(goto :EOF)
)
if %number%==KB968930 (
reg query "%detect_NET_35%" 1>nul 2>&1
if !ERRORLEVEL!==1 (echo %number% skipped MS .Net Framework 3.5 SP1 not detected>>%SystemDrive%\Installed_Updates.log)&(goto :EOF)
)
if %number%==KB890830 if exist %windir%\system32\mrt.exe for /f "tokens=1" %%d in ('dir %windir%\system32\mrt.exe /T:W^|findstr /I /C:"mrt"') do (
if "%%d"=="%cur_date_mrt%" (echo %number% detected in %windir%\system32\mrt.exe - modified %%d>>%SystemDrive%\Detected_Updates.log)&(goto :EOF)
)
if %number%==KB905474 if not exist ".\KBxxxxxx\KB905474.exe" goto :EOF
rem ---Выполняем запрос сведений об обновлении во всех ветках реестра указанных в файле RegKeys.txt из папки Config и прерываем поиск при успешном запросе---
for /F "tokens=*" %%l in (.\Config\RegKeys.txt) do (
reg query "%%l" 1>nul 2>&1
if !ERRORLEVEL!==0 (set detect_key=1)&(echo !number! detected in %%l>>%SystemDrive%\Detected_Updates.log)&(goto chk_detect)
)
:chk_detect
rem ---Выполняем установку обновления если сведения в реестре не обнаружены---
if !detect_key!==0 (
rem ---Выполняем анализ наличия или отсутствия переопределения (в KB.txt) ключей установщика заданных по-умолчанию (в Set.txt)---
if !UserSwitches!==No (
if exist .\KBxxxxxx\%number%.exe (start /wait .\KBxxxxxx\%number%.exe %MainSwitches%) else (
if exist .\KBxxxxxx\%number%.msi (start /wait .\KBxxxxxx\%number%.msi !MainSwitches!) else (
echo %number% skipped file not found in KBxxxxxx>>%SystemDrive%\Installed_Updates.log)&(goto :EOF)
)
echo %number% %MainSwitches%>>%SystemDrive%\Installed_Updates.log
) ELSE (
if exist .\KBxxxxxx\%number%.exe (start /wait .\KBxxxxxx\%number%.exe !UserSwitches!) else (
if exist .\KBxxxxxx\%number%.msi (start /wait .\KBxxxxxx\msiexec /i %number%.msi !UserSwitches!) else (
if exist .\KBxxxxxx\%number%.cmd (start /wait /min .\KBxxxxxx\%number%.cmd !UserSwitches!)&(goto :EOF) else (
echo %number% skipped file not found in KBxxxxxx>>%SystemDrive%\Installed_Updates.log)&(goto :EOF)
)
)
echo %number% !UserSwitches!>>%SystemDrive%\Installed_Updates.log
)
rem ---Выполняем задержку перед установкой следующего обновления---
%delay%
goto :EOF
)
goto :EOF
rem ---Процедура удаления ярлыков Internet Explorer с рабочего стола и панели быстрого запуска с проверкой существования папки .\IE и сведений в реестре---
:IEclrlnk
if exist .\IE if exist "%USERPROFILE%\Application Data\Microsoft\Internet Explorer\Quick Launch\*Internet Explorer*.lnk" (
reg query "%detect_IE%" 1>nul 2>&1
if !ERRORLEVEL!==0 (
start /wait regedit /s .\IE\DDL_IE.reg
start /wait /min .\Tools\nircmd.exe shellrefresh
start /wait .\IE\IElnk.exe
)
)
goto :EOF
rem ---Процедура установки Windows Roots Update с проверкой соответствия текущей версии указанной в Set.txt---
:rootsupdate
for /f "tokens=3 delims= " %%v in ('reg query "%detect_rootsupd%" /v Version') do set detect_ver_rootsupd=%%v
if not "%detect_ver_rootsupd%"=="%cur_ver_rootsupd%" (.\Other\rootsupd.exe %OldSwitches%&echo Windows Roots Update %OldSwitches% - ver:"%cur_ver_rootsupd%">>%SystemDrive%\Installed_Updates.log
) ELSE echo Windows Roots Update detected in %detect_rootsupd%>>%SystemDrive%\Detected_Updates.log
goto :EOF
rem ---Процедура установки библиотек VC++ с проверкой существования папки .\VC++ и веток реестра указанных в Set.txt
:VC++
if exist .\VC++ (
reg query "%detect_VC05%" 1>nul 2>&1
if !ERRORLEVEL!==1 (
start /wait .\VC++\vcredist_x86_2005.exe %OldSwitches%
echo VC++ 2005 %OldSwitches%>>%SystemDrive%\Installed_Updates.log
%delay%
) ELSE echo VC++ 2005 detected in %detect_VC05%>>%SystemDrive%\Detected_Updates.log
reg query "%detect_VC08%" 1>nul 2>&1
if !ERRORLEVEL!==1 (
start /wait .\VC++\vcredist_x86_2008.exe %OldSwitches%
echo VC++ 2008 %OldSwitches%>>%SystemDrive%\Installed_Updates.log
%delay%
) ELSE echo VC++ 2008 detected in %detect_VC08%>>%SystemDrive%\Detected_Updates.log
reg query "%detect_VC10%" 1>nul 2>&1
if !ERRORLEVEL!==1 (
start /wait .\VC++\vcredist_x86_2010.exe %OldSwitches%
echo VC++ 2010 %OldSwitches%>>%SystemDrive%\Installed_Updates.log
%delay%
) ELSE echo VC++ 2010 detected in %detect_VC10%>>%SystemDrive%\Detected_Updates.log
)
goto :EOF