Отключение компонентов данным скриптом обратимо. Я делаю это главным образом для того, чтобы убрать из меню Пуск ссылки на ненужные мне программы. Здесь для примера указано по два компонента для каждой версии Windows, которые будут отключены. Тем, кто будет использовать данный скрипт в своей работе, необходимо дополнить его. Определите компоненты, которые вам не понадобятся и добавьте их отключение в скрипт. Путём нехитрых изменений, можно наоборот — включать компоненты. Для своих нужд Я оставляю только Internet Explorer, Media Player, Windows Search и .NET Framework 3.5.1. Последний отключён производителем в новых версиях Windows, с удалением файлов, и чтобы его включить у меня есть отдельный скрипт, о котором Я напишу позже.
Скрипт
@echo off
title Disabling features in Windows image
set _file=install.wim
set _img=Online
set _mnt=mount
set _tool=7
set _word=Wim
dism /English /LogLevel:1 /Get-Help | find "Version: 6.1" > nul || set _tool=8
if %_tool% GTR 7 set _word=Image
:pre_menu
cls
if not exist %_file% goto :version
dism /English /LogLevel:1 /Get-%_word%Info /%_word%File:%_file%
echo -------------------------------------------------------------------------------
if %ERRORLEVEL% NEQ 0 pause & exit
set /p _ind=Input index or press [Enter] for quit: || exit
if %_ind% EQU 0 goto :version
if %_ind% GTR 0 if %_ind% LEQ 24 goto :ind_menu
goto :pre_menu
:ind_menu
cls
dism /English /LogLevel:1 /Get-%_word%Info /%_word%File:%_file% /Index:%_ind%
echo -------------------------------------------------------------------------------
if %ERRORLEVEL% NEQ 0 pause & goto :pre_menu
choice /c abcdefghijklmnopqrstuvwxyz /n /m "Mount selected image? [m] "
if %ERRORLEVEL% EQU 13 goto :mount
goto :pre_menu
:version
dism /%_img% /English /LogLevel:1 /Get-Help | find "Image Version: 6.1" > nul && goto :disable-7
dism /%_img% /English /LogLevel:1 /Get-Help | find "Image Version: 6.3" > nul && goto :disable-9
dism /%_img% /English /LogLevel:1 /Get-Help | find "Image Version: 10" > nul && goto :disable-A
goto :unmount
:disable-7
cls
echo Getting list of features. Please wait...
dism /%_img% /English /LogLevel:1 /Get-Features /Format:Table > %TEMP%\features.txt
echo -------------------------------------------------------------------------------
set /a _num+=1
echo %_num% Disable: WindowsGadgetPlatform
call :state WindowsGadgetPlatform &&^
dism /%_img% /English /LogLevel:1 /Disable-Feature /FeatureName:WindowsGadgetPlatform /NoRestart
echo -------------------------------------------------------------------------------
set /a _num+=1
echo %_num% Disable: MediaCenter
call :state MediaCenter &&^
dism /%_img% /English /LogLevel:1 /Disable-Feature /FeatureName:MediaCenter /NoRestart
echo -------------------------------------------------------------------------------
del %TEMP%\features.txt
if not exist %_file% exit
goto :unmount
:disable-9
cls
echo Getting list of features. Please wait...
dism /%_img% /English /LogLevel:1 /Get-Features /Format:Table > %TEMP%\features.txt
echo -------------------------------------------------------------------------------
set /a _num+=1
echo %_num% Disable: Printing-Foundation-Features
call :state Printing-Foundation-Features &&^
dism /%_img% /English /LogLevel:1 /Disable-Feature /FeatureName:Printing-Foundation-Features /NoRestart
echo -------------------------------------------------------------------------------
set /a _num+=1
echo %_num% Disable: Windows-Defender-Default-Definitions
call :state Windows-Defender-Default-Definitions &&^
dism /%_img% /English /LogLevel:1 /Disable-Feature /FeatureName:Windows-Defender-Default-Definitions /NoRestart
echo -------------------------------------------------------------------------------
del %TEMP%\features.txt
if not exist %_file% exit
goto :unmount
:disable-A
cls
echo Getting list of features. Please wait...
dism /%_img% /English /LogLevel:1 /Get-Features /Format:Table > %TEMP%\features.txt
echo -------------------------------------------------------------------------------
set /a _num+=1
echo %_num% Disable: MicrosoftWindowsPowerShellV2Root
call :state MicrosoftWindowsPowerShellV2Root &&^
dism /%_img% /English /LogLevel:1 /Disable-Feature /FeatureName:MicrosoftWindowsPowerShellV2Root /NoRestart
echo -------------------------------------------------------------------------------
set /a _num+=1
echo %_num% Disable: NetFx4-AdvSrvs
call :state NetFx4-AdvSrvs &&^
dism /%_img% /English /LogLevel:1 /Disable-Feature /FeatureName:NetFx4-AdvSrvs /NoRestart
echo -------------------------------------------------------------------------------
del %TEMP%\features.txt
if not exist %_file% exit
goto :unmount
:state
findstr %1 %TEMP%\features.txt | find "Enable" > nul
exit /b
:mount
cls
md %_mnt%
dism /English /LogLevel:1 /Mount-%_word% /%_word%File:%_file% /Index:%_ind% /MountDir:%_mnt%
if %ERRORLEVEL% NEQ 0 rd %_mnt% & pause & exit
set _img=Image:%_mnt%
goto :version
:unmount
cls
if not %_img%==Online (
dism /English /LogLevel:1 /Unmount-%_word% /MountDir:%_mnt% /Commit
rd %_mnt%
)
set _img=Online
goto :pre_menu
Использование
Данный скрипт может отключать компоненты как в онлайн системе так и в автономном образе. Если в папке запуска отсутствует файл образа — install.wim, то скрипт выполняет отключение компонентов в полностью автоматическом режиме. Если в папке запуска присутствует файл образа — install.wim, то скрипт выполняет считывание из него информацию об имеющихся «индексах» и предлагает ввести номер. После этого отображается расширенная информация о выбранном «индексе» выдаётся запрос на монтирование. Нажатие любой клавиши приводит к возврату, а нажатие клавиши [m] запускает следующую цепочку действий: монтирование образа, отключение компонентов, размонтирование образа, возврат в меню выбора «индеска». После чего можно выбрать другой «индекс» для отключения компонентов. Выбор «индекса» под номером 0 запускает отключение компонентов на «живой» ОС.
Разбор кода
Вначале командой set происходит установка переменных. Можно изменить предполагаемое имя файла образа install.wim (например, на install.esd). Можно изменить имя папки монтирования или задать путь, если папка монтирования должна находится за пределами папки запуска. От установки «уровня» логирования, как в предыдущем скрипте по пакетам обновления, решил отказаться и напрямую прописал во всех командах информирование только об ошибках — /LogLevel:1. Также во всех командах добавил ключ /English чтобы все сообщения отображались на английском языке.
Скрипт может быть запущен на разных версиях ОС, и таким образом обращаться к разным версиям системы DISM, которые отличаются набором команд. Так, в версиях после 6.1 во всех командах, слово Wim заменено на Image, хотя и оставлены старые «наименования» команд для обратной совместимости. В самом начале работы скрипта определяется версия утилиты dism.exe и в дальнейшем во все команды подставляется нужное слово. Без определения версии можно было бы и обойтись, но данный функционал Я использую в своём скрипте по получению информации из образа Windows, поэтому просто не стал переписывать код.
:pre_menu
Предварительное меню. Получение основной информации о wim-файле с контролем ошибок. Если отсутствует файл образа, то запуск в режиме Online. Не нашел информацию о максимальном количестве «индексов» в одном образе и установил значение 24.
:ind_menu
Индексное меню. Получение расширенной информации о выбранном «индексе» в wim-файле с контролем ошибок. Предложение смонтировать «индекс».
:version
Определение версии целевой системы. Если находится необходимая строка, то осуществляется переход к указанной метке. Если строка не обнаруживается, то происходит размонтирование.
:disable-7 :disable-9 :disable-A
Метки целевых систем обслуживания. Я называю Windows 8.1 — девяткой, а Windows 10 — Windows A (кто в теме тот поймёт), поэтому такие имена у меток. Вначале данного блока происходит запрос состояния всех компонентов с сохранением в файл features.txt. В дальнейшем, чтобы ускорить процесс отключения и не пытаться отключить то, что и так отключено, происходит предварительная проверка состояния каждого компонента. В конце блока — удаление временных файлов и размонтирование.
:state
Проверка состояния компонента. Псевдо-функция, возвращающая результат по коду ошибки в глобальную переменную %ERRORLEVEL%. Строка с именем компонента ищется в файле features.txt и если находится и также обнаруживается слово «Enable», то сигнал к отключению.
:mount
Монтирование образа. Предварительно создаётся папка монтирования. Контроль ошибок. Изменяется переменная определяющая спецификацию образа, теперь указывает на путь к автономному образу.
:unmount
Размонтирование образа. Если выполнялось интерактивное обслуживание (/Online), то размонтировать не нужно. Возвращение переменных к исходным значениям.
Возможные проблемы
При обслуживании образа вышестоящей версии на системе нижестоящей версии возможны зависания и ошибки. То есть, не нужно пытаться на Windows 7 обрабатывать файл образа Windows 8.1 или 10. Также для успешного выполнения всех команд требуется отключить Контроль учётных записей — параметр EnableLUA установить в значение 0.
Вопрос
Отключаю все компоненты связанные с печатью и при этом мой принтер продолжает печатать, а сканер — сканировать. Предполагаю, что компоненты печати (например Printing-Foundation-Features и д.р.) используются для расширенных возможностей — например, для установки принтера доступным по сети. Так ли это?
Комментарии (13)
andreili
25.12.2017 19:52Добро пожаловать в DISM++, где всё (и даже больше) есть «из коробки». И интерфейс там вполне понятен, вся система настраивается (ну ладно, почти вся).
Ostan Автор
25.12.2017 21:34Я знаю об этой программе. Но! Это стороннее средство, а Я использую инструмент предоставляемый «производителем». Имея готовые скрипты «обработать» автономный образ можно значительно быстрее, чем кликать мышкой по кнопкам. DISM++ больше подходит для тонкой настройки онлайн образа.
akadone
26.12.2017 01:15Я делаю это главным образом для того, чтобы убрать из меню Пуск ссылки на ненужные мне программы
А не проще установить нормальное меню пуск и больше не париться по этой проблеме вообще?maxzhurkin
26.12.2017 03:45Вы упустили те моменты, что статья не именно про меню пуск и что речь идёт не о модификации установленной системы (хотя и она возможна), а о модификации образа для установки
akadone
26.12.2017 06:11Интегрировать нормальный пуск в дистрибутив — сам Билл Гейтс велел. В том-же win 10 целый квест бывает запустить какую-то недавно установленную программу.
maxzhurkin
26.12.2017 19:22Билл Гейтс!? Не он ли в том числе приложил руку к тому, что его дезинтегрировали?
rbobot
26.12.2017 08:21-1Писать в 2к17 на batch, вместо прекрасного Powershell — моветон.
Ostan Автор
26.12.2017 08:30Я себе поставил задачу и решил её доступным мне способом. Мне лично PS не понравился — монстрообразный инструмент с огромным количеством команд (командлетов), запомнить которые нереально, а запуск с повышением прав это вообще изощрение. Поэтому Я не гонюсь за модой.
citleon1
26.12.2017 18:59Прикольный скрипт. А на Windows Server 2016 Вы его пробовали запускать?
dr_martins
28.12.2017 09:06DISM++, упомянутый выше, работает норм на Windows Server 2016. В любом из вариантов ОБЯЗАТЕЛЬНО делай бэкап, например Acronis'ом
osipov_dv
Статья про троллейбус из буханки