У меня есть серия статей, посвящённая теме обслуживания образов Windows с помощью системных команд. ДИСМ .
В моих статьях приводились примеры скриптов на языке интерпретатора командной строки.
cmd.exe .
В результате исходный образ Windows (живая система или отдельный файл) *.
wim ) изменилось - в него были интегрированы обновления, отключены системные компоненты и удалены универсальные приложения.
Но как увидеть изменения, внесенные в изображение? В этой статье я представляю скрипт, который с помощью системных команд DISM извлекает различную информацию из образа Windows и отображает ее пользователю на экране или экспортирует в файл.
Этот скрипт будет полезен системным администраторам, создающим свои «сборки» или тестирующим другие.
Иногда может возникнуть необходимость посмотреть некоторую информацию об установленной ОС – в этом случае этот скрипт тоже пригодится.
В этом скрипте реализованы все команды DISM для получения информации из образа Windows. Информация с изображения, которую можно получить с помощью этого скрипта:
- Драйверы устройств (наличие);
- Пакеты обновлений (наличие);
- Компоненты системы (статус);
- Языковая поддержка (статус);
- Редакции Windows (статус);
- Классические приложения (наличие);
- Универсальные приложения (наличие);
- Ассоциации файлов (состояние).
Если объект определенного типа можно добавить или удалить с изображения, то в информации будет указано наличие объектов этого типа на изображении.
Если какое-то свойство операционной системы можно переключить в образе (например, включить/отключить), то в информации будет отображаться состояние этого свойства.
Последние два пункта в списке доступны только на операционках, начиная с Windows 8. Я назвал этот скрипт GetWimInfo.cmd , а вот и он:
Скрипт
@echo off title Getting information from Windows image set _file=install.wim set _img=Online set _mnt=mount set _tool=7 set _word=Wim ver | find "6.1" > nul || set _tool=8 if %_tool% GTR 7 set _word=Image :pre_menu cls if not exist %_file% goto :adv_menu 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 :adv_menu 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 :adv_menu cls if %_img%==Online (echo DISM: Online Servicing)^ else (dism /English /LogLevel:1 /Get-Mounted%_word%Info) echo ------------------------------------------------------------------------------- echo ~~~~Menu~~~~ echo [d] drivers ([D] - export) echo [p] packages ([P] - export) echo [f] features ([F] - export) echo [l] languages echo [e] editions echo [a] app if %_tool% GTR 7 echo [x] appx ([X] - export) if %_tool% GTR 7 echo [s] assoc ([S] - export) echo [q] quit (unmount) echo ------------------------------------------------------------------------------- choice /c dDpPfFleaxXsSq /n /cs /m "Your choice: " if %ERRORLEVEL% EQU 1 goto :drivers if %ERRORLEVEL% EQU 2 goto :drivers-export if %ERRORLEVEL% EQU 3 goto :packages if %ERRORLEVEL% EQU 4 goto :packages-export if %ERRORLEVEL% EQU 5 goto :features if %ERRORLEVEL% EQU 6 goto :features-export if %ERRORLEVEL% EQU 7 goto :languages if %ERRORLEVEL% EQU 8 goto :editions if %ERRORLEVEL% EQU 9 goto :app if %ERRORLEVEL% EQU 10 if %_tool% GTR 7 (goto :appx) else (goto :adv_menu) if %ERRORLEVEL% EQU 11 if %_tool% GTR 7 (goto :appx-export) else (goto :adv_menu) if %ERRORLEVEL% EQU 12 if %_tool% GTR 7 (goto :assoc) else (goto :adv_menu) if %ERRORLEVEL% EQU 13 if %_tool% GTR 7 (goto :assoc-export) else (goto :adv_menu) goto :unmount :drivers cls dism /%_img% /English /LogLevel:1 /Get-Drivers /All | more echo ------------------------------------------------------------------------------- choice /c b /n /m "Back [b] " goto :adv_menu :drivers-export cls if exist drivers%_numd%.
txt set /a _numd+=1 & goto :drivers-export echo Getting list of drivers. Please wait. dism /%_img% /English /LogLevel:1 /Get-Drivers /All /Format:Table > drivers%_numd%.
txt goto :adv_menu :packages cls dism /%_img% /English /LogLevel:1 /Get-Packages | more echo ------------------------------------------------------------------------------- choice /c b /n /m "Back [b] " goto :adv_menu :packages-export cls if exist packages%_nump%.
txt set /a _nump+=1 & goto :packages-export echo Getting list of packages. Please wait. dism /%_img% /English /LogLevel:1 /Get-Packages /Format:Table > packages%_nump%.
txt goto :adv_menu :features cls dism /%_img% /English /LogLevel:1 /Get-Features | more echo ------------------------------------------------------------------------------- choice /c b /n /m "Back [b] " goto :adv_menu :features-export cls if exist features%_numf%.
txt set /a _numf+=1 & goto :features-export echo Getting list of features. Please wait. dism /%_img% /English /LogLevel:1 /Get-Features /Format:Table > features%_numf%.
txt goto :adv_menu :languages cls dism /%_img% /English /LogLevel:1 /Get-Intl echo ------------------------------------------------------------------------------- choice /c b /n /m "Back [b] " goto :adv_menu :editions cls dism /%_img% /English /LogLevel:1 /Get-CurrentEdition echo ------------------------------------------------------------------------------- dism /%_img% /English /LogLevel:1 /Get-TargetEditions echo ------------------------------------------------------------------------------- choice /c b /n /m "Back [b] " goto :adv_menu :app cls if %_img%==Online goto :adv_menu dism /%_img% /English /LogLevel:1 /Get-Apps echo ------------------------------------------------------------------------------- dism /%_img% /English /LogLevel:1 /Get-AppPatches echo ------------------------------------------------------------------------------- choice /c b /n /m "Back [b] " goto :adv_menu :appx cls dism /%_img% /English /LogLevel:1 /Get-ProvisionedAppxPackages | more echo ------------------------------------------------------------------------------- choice /c b /n /m "Back [b] " goto :adv_menu :appx-export cls if exist appxes%_numx%.
txt set /a _numx+=1 & goto :appx-export echo Getting list of appx. Please wait. dism /%_img% /English /LogLevel:1 /Get-ProvisionedAppxPackages > appxes%_numx%.
txt goto :adv_menu :assoc cls dism /%_img% /English /LogLevel:1 /Get-DefaultAppAssociations | more echo ------------------------------------------------------------------------------- choice /c b /n /m "Back [b] " goto :adv_menu :assoc-export cls if exist associat%_nums%.
txt set /a _nums+=1 & goto :assoc-export echo Getting list of assoc. Please wait. dism /%_img% /English /LogLevel:1 /Get-DefaultAppAssociations > associat%_nums%.
txt goto :adv_menu :mount cls md %_mnt% dism /English /LogLevel:1 /Mount-%_word% /%_word%File:%_file% /Index:%_ind% /MountDir:%_mnt% /ReadOnly if %ERRORLEVEL% NEQ 0 rd %_mnt% & pause & exit set _img=Image:%_mnt% goto :adv_menu :unmount cls if not exist %_file% exit if not %_img%==Online ( dism /English /LogLevel:1 /Unmount-%_word% /MountDir:%_mnt% /Discard rd %_mnt% ) set _img=Online goto :pre_menu
Применение
Если в папке запуска скрипта находится автономный образ операционной системы Windows - файл install.wim , затем у него запрашивается информация о доступных индексах и пользователю предлагается ввести число, с которым он будет работать.Следующее подменю отображает расширенную информацию о выбранном индексе и предлагает пользователю смонтировать этот образ для продолжения работы.
После монтирования образа на экране отображается главное меню скрипта.
Если в папке запуска скрипта нет файла install.wim , то вы сразу переходите в главное меню, и запросы информации будут направлены к текущей ОС.
Работать с главным меню очень просто – достаточно нажать соответствующую клавишу, чтобы вывести информацию на экран.
Для некоторых элементов объем данных может быть большим, поэтому добавлены элементы для экспорта информации в созданный текстовый файл в папке запуска скрипта.
Ээкспорт в файл - заглавная буква.
Парсинг кода
Сначала команда set устанавливает переменные.Также сначала логически определяется версия ОС, на которой работает скрипт - если не Windows 7, то что-то поновее.Вы можете изменить предполагаемое имя файла образа install.wim (например, на install.esd).
Вы можете изменить имя папки монтирования (монтирование по умолчанию) или указать путь, если папка монтирования должна находиться за пределами папки автозагрузки.
На основании этого делается вывод о том, какая версия системы DISM будет принимать команды сценариев, что влияет на доступность двух последних пунктов меню.
:pre_menu
Предварительное меню.Получение основной информации о wim-файле с контролем ошибок.
Если файл образа отсутствует, то запустите в режиме Online.
:ind_menu
Индексное меню.Получение расширенной информации о выбранном «индексе» в wim-файле с контролем ошибок.
Предложение смонтировать "индекс".
:adv_menu
Главное (расширенное) меню скрипта.После нажатия клавиши, соответствующей выбранному пункту, происходит переход к соответствующей метке в теле скрипта с последующим выполнением необходимых команд и возвратом в это меню.
Все элементы вывода информации на экран однотипны и включают в себя некоторую команду DISM. Их нет необходимости разбирать.
Вместо отображения информации на экране больший интерес представляет экспорт в текстовый файл.
Информация записывается в табличной форме, удобной для восприятия и сравнения.
Для каждого типа информации – текстовый файл с определенным именем.
Повторный экспорт в определенный момент не заменяет файл, а создает новый путем добавления к имени числового индекса.
Это удобно, например, при сборе информации из нескольких разных индексов изображений.
:устанавливать
Монтируем образ.Также отмечу, что монтирование осуществляется в режиме /ТолькоЧтение , что означает, что невозможно внести какие-либо изменения в изображение, включая даты и атрибуты файла изображения.Сначала создается папка монтирования.
Контроль ошибок.
Переменная, определяющая спецификацию изображения, изменена и теперь указывает путь к автономному изображению.
:размонтировать
Размонтирование образа.Размонтирование с помощью ключа /Отказаться , поскольку монтирование было доступно только для чтения.Если проводилось интерактивное обслуживание (/Online), то размонтировать не нужно.
Возврат переменных к исходным значениям.
Отсутствие ключа недопустимо.
Заключение
Этот скрипт является логическим дополнением к коллекции скриптов, которую я представил в предыдущих статьях.Хотя, по правде говоря, все это было написано более трех месяцев назад, и этот сценарий был у меня первым.
Я просто понемногу раскрываю свои карты.
Конечно, многие системные администраторы уже давно написали для себя подобные решения, и у каждого они свои.
Чужие разработки мне показались неудобными, в некоторых случаях громоздкими.
Кто-то пытался реализовать все возможности системы DISM в одном «мега» скрипте, но я решил сделать несколько скриптов, каждый под определённую задачу.
Наверное, не очень хорошо, что часть кода повторяется, потому что при реализации некоторых идей и/или исправлении ошибок мне приходилось редактировать все файлы сразу.
Рекламодатели PowerShell проходят мимо.
Этот скрипт я написал для себя и решил поделиться с вами таким, какой он есть.
Надеюсь, многим будет полезно – как для работы, так и как пример в учебе.
Теги: #Windows #Системное администрирование #.
info #cmd #dism
-
Netflix На Nes: Как Это Работает?
19 Oct, 24