Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье приведены некоторые сведения о проблеме сохранения языковых ресурсов и функций по запросу во время обновлений операционной системы, а также рекомендации, которые помогут вам двигаться вперед в краткосрочной перспективе и подготовиться к долгосрочной перспективе.
При обновлении операционной системы важно сохранить языковые ресурсы и функции по запросу (FOD). Многие коммерческие организации используют Configuration Manager или другие средства управления для распространения и оркестрации установки клиента Windows с помощью локального образа Windows или WIM-файла (обновление на основе мультимедиа или последовательности задач). Другие пользователи выполняют обновления на месте с помощью утвержденного обновления компонентов клиента Windows с помощью Windows Server Update Services (WSUS), Configuration Manager или эквивалентных средств (обновление на основе обслуживания).
Ни один из подходов не содержит полный набор дополнительных функций Windows, которые могут потребоваться устройству пользователя, поэтому эти функции не переносятся в новую операционную систему. В прошлом эти функции не были доступны в Configuration Manager и WSUS для локального приобретения после обновления компонентов.
Что такое необязательное содержимое?
Дополнительное содержимое включает следующие элементы:
- Общие функции по запросу, также называемые FOD (например, Windows Mixed Reality)
- Языковые и региональные FOD (например, Language.Basic~~ja-jp~0.0.1.0)
- Пакеты локального интерфейса
- Языковые пакеты
Необязательное содержимое не включается по умолчанию в файл образа Windows, который является частью носителя операционной системы, доступного в Центре обслуживания корпоративного лицензирования (VLSC). Вместо этого он выпускается в виде дополнительного ISO-файла в VLSC. Доставка этих функций с носителя операционной системы и их отдельная доставка сокращает дисковое пространство Windows. Такой подход предоставляет больше места для данных пользователя. Это также сокращает время, необходимое для обслуживания операционной системы, будь то установка ежемесячного обновления качества или обновление до более новой версии. Меньший образ Windows по умолчанию также означает меньше данных для передачи по сети.
Почему получение дополнительного содержимого является сложной задачей?
Проблемы, связанные с дополнительным содержимым, обычно делятся на две группы:
Неполные обновления операционной системы
Первая проблема связана с переносом содержимого во время обновления компонентов. Когда программа установки Windows выполняет обновление на месте, новая операционная система записывается на диск пользователя вместе со старой версией во временной папке, где устанавливается вторая чистая операционная система и подготавливается к переходу пользователя. При выполнении операции программа установки Windows перечисляет дополнительное содержимое, установленное уже в текущей версии, и планирует установить новую версию этого содержимого в новой операционной системе.
Программе установки Windows требуется доступ к необязательному содержимому. Так как необязательное содержимое по умолчанию не содержится в образе Windows, программа установки Windows должна искать в другом месте, чтобы получить пакеты Windows, подготовить их к этапу, а затем установить их в новой операционной системе. Если содержимое не удается найти, результатом является обновление, в результате чего отсутствуют функции на устройстве, разочарованный конечный пользователь и, скорее всего, звонок в службу поддержки. Эту болевую точку иногда называют неудачей при переносе необязательного содержимого во время обновления. Для обновлений на основе мультимедиа Windows автоматически попытается повторить попытку после загрузки новой операционной системы. Мы называем это скрытым приобретением.
Сбой при получении компонентов, инициированных пользователем
Вторая проблема связана с неспособностью получить функции, когда пользователь запрашивает их. Представьте себе пользователя, работающего на устройстве с новой версией клиента Windows, с помощью чистой установки или обновления на месте. Пользователь посещает параметры и пытается установить второй язык, дополнительные функции языкового интерфейса или другое необязательное содержимое. Опять же, так как эти функции отсутствуют в операционной системе, пакеты необходимо получить. Для обычного пользователя с доступом к Интернету Windows приобретает функции из соседней сети доставки содержимого Майкрософт, и все работает по плану. Для коммерческих пользователей некоторые из них могут не иметь доступа к Интернету или иметь политики для предотвращения приобретения через Интернет. В таких ситуациях Windows должна получать содержимое из другого расположения. Если содержимое не удается найти, пользователи расстроены, и может возникнуть другой звонок в службу поддержки. Эту болевую точку иногда называют неспособностью получить необязательное содержимое.
Параметры получения дополнительного содержимого
Большинство коммерческих организаций понимают описанные выше проблемы, и обсуждения обычно начинаются с вопроса о том, какие планы доступны для решения этих проблем. В следующей таблице приведено несколько вариантов, которые следует рассмотреть в зависимости от того, как вы сейчас развертываете клиент Windows. В заголовках таблицы используются следующие определения:
- Миграция. Поддерживает необязательную миграцию содержимого во время обновления.
- Приобретение: поддерживает необязательный сбор содержимого (т. е. инициированный пользователем).
- Мультимедиа: применимо к развертываниям на основе мультимедиа.
- Обслуживание: применимо к развертываниям на основе обслуживания.
| Метод | Миграция | Приобретение | Носители | Обслуживание |
|---|---|---|---|---|
| Вариант 1. Использование клиентский компонент Центра обновления Windows | Да | Да | Нет | Да |
| Вариант 2. Использование WSUS с интеграцией UUP | Да | Да | Нет | Да |
| Вариант 3. Включение динамического обновления | Да | Нет | Да | Да |
| Вариант 4. Настройка образа Windows перед развертыванием | Да | Нет | Да | Нет |
| Вариант 5. Установка языковых компонентов во время развертывания | Частично | Нет | Да | Нет |
| Вариант 6. Установка дополнительного содержимого после развертывания | Да | Нет | Да | Да |
| Вариант 7. Настройка альтернативного источника для функций по запросу | Нет | Частично | Да | Да |
Вариант 1. Использование клиентский компонент Центра обновления Windows
клиентский компонент Центра обновления Windows политики клиента решают необязательную проблему с содержимым. Дополнительное содержимое публикуется и доступно для приобретения программой установки Windows из ближайшей сети доставки содержимого Майкрософт и приобретается с помощью единой платформы обновлений. Необязательные сценарии миграции и получения содержимого работают только тогда, когда устройство подключено к службе обновлений, которая использует единую платформу обновлений, например политики клиентский компонент Центра обновления Windows или клиентский компонент Центра обновления Windows клиента. Если по какой-либо причине языковой пакет не удается установить во время обновления, обновление автоматически откатится.
Единая платформа обновлений — это усовершенствование базовой технологии обновления Windows, которая приводит к уменьшению размеров загрузки и более эффективному протоколу для проверки наличия обновлений, получения и установки необходимых пакетов и получения актуальной информации за один шаг обновления. Эта технология является унифицированной, так как она объединяет стек обновлений для клиента Windows, Windows Server и других продуктов, таких как HoloLens.
Рассмотрите возможность перехода к клиентский компонент Центра обновления Windows клиентским политикам. Необязательный сценарий содержимого будет работать не только без проблем (как это делается сегодня для потребительских устройств), но вы также получите все преимущества загрузки меньшего размера. Кроме того, устройства не подвержены проблеме обновления Windows, когда язык установки операционной системы непреднамеренно изменяется на новый. В противном случае любые будущие обновления компонентов на основе носителя могут завершиться ошибкой, если установочный носитель имеет другой язык установки. Дополнительные сведения об этой проблеме см. в статье Обновление Windows 10 устройств с установочным носителем, отличным от исходного языка установки ОС.
Вариант 2. Использование WSUS с интеграцией UUP
Начиная с марта 2023 г., UUP интегрируется с WSUS и Configuration Manager, чтобы обеспечить в локальных решениях по управлению те же дополнительные преимущества содержимого и приобретения, что и клиентский компонент Центра обновления Windows. Пример
FoD и языки будут автоматически переноситься для устройств, которые выполняют обновление на месте с помощью утвержденного обновления функций клиента Windows 11 версии 22H2 из WSUS. Аналогичным образом, обновления, такие как объединенное накопительное обновление, обновления установки и обновления безопасной ОС, включаются и актуальны в зависимости от месяца утверждения обновления компонентов.
Устройства, которые обновляются с помощью локального образа Windows, но используют WSUS или Configuration Manager для утверждения объединенного накопительного обновления, будут иметь поддержку дополнительного получения содержимого в обновленной ОС Windows, а также самостоятельного восстановления ОС.
Содержимое, необходимое для включения этой функции, будет получаться через WSUS или Configuration Manager без подключения к Интернету для конечных точек клиента. Чтобы включить это улучшение, один раз за основной выпуск Windows требуется значительное скачивание в каталог содержимого WSUS или точку распространения. Сюда входят пакеты для поддержки FOD и приобретения языка, а также пакеты для обеспечения самовосстановления ОС из-за повреждения. Дополнительные сведения см. в статье Планирование развертывания WSUS.
Вариант 3. Включение динамического обновления
Если вы не готовы перейти на клиентский компонент Центра обновления Windows, другой вариант — включить динамическое обновление во время обновления компонентов. Как только запускается обновление компонентов Windows, будь то с помощью обновления на основе мультимедиа или обновления компонентов на основе WSUS, динамическое обновление является одним из первых этапов вызова. Программа установки Windows подключается к URL-адресу для доступа к Интернету, размещенного корпорацией Майкрософт, для получения содержимого динамического обновления, а затем применяет эти обновления к установочному носителю операционной системы. Полученное содержимое включает следующее:
- Обновления установки. Исправления для Setup.exe двоичных файлов или файлов, используемых программой установки для обновления компонентов.
- Безопасные обновления ОС: исправления для безопасной ОС , которые используются для обновления среды восстановления Windows (WinRE).
- Обновления стека обслуживания. Исправления, необходимые для решения проблемы с стека обслуживания Windows и, следовательно, необходимые для завершения обновления компонентов.
- Последнее накопительное обновление. Устанавливает последнее накопительное обновление качества.
- Обновления драйверов. Последняя версия применимых драйверов, которые уже были опубликованы производителями в клиентский компонент Центра обновления Windows и предназначены специально для динамического обновления.
В дополнение к этим обновлениям для новой операционной системы динамическое обновление получает необязательное содержимое во время процесса обновления, чтобы гарантировать наличие этого содержимого на устройстве по завершении обновления. Таким образом, хотя устройство не подключено к клиентский компонент Центра обновления Windows, оно получает содержимое из соседней сети загрузки содержимого Майкрософт (CDN). Этот подход устраняет первую боль с необязательным содержимым, но не с инициированным пользователем приобретением. По умолчанию динамическое обновление включается программой установки Windows. Динамическое обновление можно включить или отключить с помощью параметра /DynamicUpdate в программе установки Windows. Если используется подход на основе обслуживания, это значение можно задать с setupconfig.iniпомощью . Дополнительные сведения см. в статье Общие сведения об автоматизации установки Windows .
Динамическое обновление можно настроить с помощью дополнительных параметров. Например, вы можете воспользоваться преимуществами необязательной миграции содержимого без автоматического получения последнего обновления качества. Это можно сделать с помощью параметра /DynamicUpdate NoLCU программы установки Windows. После этого вы будете отдельно следовать существующему процессу тестирования и утверждения ежемесячных обновлений. Недостатком этого подхода является повторная перезагрузка устройства для последнего накопительного обновления, так как оно было недоступно во время обновления компонентов.
При использовании динамического обновления следует учитывать влияние на сеть. Одним из основных блокировщиков этого подхода является забота о том, что каждое устройство будет получать это содержимое отдельно от корпорации Майкрософт. Программа установки скачивает содержимое динамического обновления с помощью оптимизации доставки, если это доступно. Для устройств, которые не подключены к Интернету, подмножество содержимого динамического обновления доступно с помощью WSUS и каталога Майкрософт.
Вариант 4. Настройка образа Windows перед развертыванием
Во многих организациях рабочий процесс развертывания включает Configuration Manager последовательность задач, которая выполняет обновление на основе мультимедиа. Некоторые клиенты либо не имеют подключения к Интернету, либо подключение плохое, поэтому они не могут включить динамическое обновление. В таких случаях рекомендуется установить дополнительное содержимое перед развертыванием. Это действие иногда называют настройкой установочного носителя.
Образ Windows можно настроить следующими способами:
- Применение накопительного обновления
- Применение обновлений к стеку обслуживания
- Применение обновлений к двоичным
Setup.exeфайлам или другим файлам, которые программа установки использует для обновления компонентов - Применение обновлений для безопасной операционной системы (SafeOS), используемой для среды восстановления Windows
- Добавление или удаление языков
- Добавление или удаление компонентов по запросу
Преимущество этого параметра заключается в том, что образ Windows может включать эти дополнительные языки, функции языкового интерфейса и другие функции по запросу путем однократных обновлений образа. Затем их можно использовать в существующей последовательности задач или настраиваемом развертывании, где Setup.exe они задействованы. Недостатком этого подхода является то, что он требует предварительной подготовки образа, включая создание скриптов с помощью DISM для установки дополнительных пакетов. Это также означает, что образ одинаков для всех устройств, которые его используют и может содержать больше функций, чем требуется некоторым пользователям. Дополнительные сведения о настройке носителя см. в разделе Обновление Windows 10 мультимедиа с помощью пакетов динамического обновления. Кроме того, как и в случае с динамическим обновлением, у вас по-прежнему есть решение для переноса необязательного содержимого, но не поддерживается инициированное пользователем необязательное получение содержимого. Кроме того, существует вариант этого параметра, в котором носитель обновляется на устройстве непосредственно перед установкой. Этот параметр позволяет настроить образ для конкретного устройства в зависимости от установленных в настоящее время.
Вариант 5. Установка языковых компонентов во время развертывания
Частичное решение для решения первой проблемной точки, когда не удалось перенести необязательное содержимое во время обновления, заключается в внедрении подмножества необязательного содержимого во время процесса обновления. Этот подход использует параметр установки Windows /InstallLangPacks для добавления языковых пакетов и языковых возможностей, таких как распознавание текста в речь, из папки, содержащей пакеты. Такой подход позволяет ИТ-специалисту взять подмножество дополнительного содержимого и подготовить его в своей сети. Если вы используете подход на основе обслуживания, вы можете настроить InstallLangPacks с помощью setupconfig.ini. Дополнительные сведения см. в статье Общие сведения об автоматизации установки Windows.
При запуске программа установки внедряет эти пакеты в новую операционную систему во время установки. Это может быть альтернативой включению динамического обновления или настройке образа операционной системы перед развертыванием. При таком подходе необходимо соблюдать осторожность, так как пакеты не могут быть переименованы. Кроме того, содержимое поступает от двух отдельных носителей isos. Ключ заключается в том, чтобы скопировать пакеты FOD и метаданные FOD .cab из FOD ISO в папку, а языковой пакет для конкретной архитектуры .cab файлы из ISO-файла LPLIP. Мы обрабатываем сбои InstallLangPacks как неустранимые и откатаем все обновление. Идея заключается в том, чтобы не оставлять пользователя в плохом состоянии, так как обновления на основе мультимедиа не переносят FOD и языки (если динамическое обновление не включено).
Этот подход имеет некоторые интересные преимущества. Исходный образ Windows не требуется изменять, что позволяет сэкономить время и создание скриптов.
Вариант 6. Установка дополнительного содержимого после развертывания
Этот параметр похож на вариант 4 в том, что после его развертывания вы настраиваете образ операционной системы с дополнительным содержимым. ИТ-специалисты могут расширить поведение программы установки Windows, выполняя собственные пользовательские сценарии действий во время и после обновления компонентов. Дополнительные сведения см. в статье Выполнение пользовательских действий во время обновления компонентов . При таком подходе можно создать миграцию необязательного содержимого для конкретного устройства, запечатав необязательное содержимое, установленное в операционной системе, а затем сохранив этот список, чтобы установить то же необязательное содержимое в новой операционной системе. Как и в варианте 5, вы будете внутренне размещать сетевую папку, содержащую источник необязательных пакетов содержимого. Затем во время выполнения программы установки на устройстве запишите список установленного дополнительного содержимого из исходной операционной системы и сохраните. Позже, после завершения установки, вы используете список для установки дополнительного содержимого, которое оставляет устройство пользователя без потери функциональности.
Вариант 7. Настройка альтернативного источника для необязательного содержимого
Несколько вариантов позволяют устранить необязательные проблемы миграции содержимого во время обновления на месте. Чтобы устранить вторую проблемную точку легкого получения необязательного содержимого в инициированном пользователем случае, можно настроить каждое устройство с помощью групповая политика Указание параметров для установки необязательных компонентов и восстановления компонентов. Этот параметр политики определяет сетевые расположения, которые будут использоваться для устранения повреждений операционной системы и включения дополнительных функций, для которых были удалены файлы полезных данных. Этот подход имеет недостаток большего количества содержимого для размещения в сети (в дополнение к образу операционной системы, который вы все еще развертываете на некоторых клиентах), но имеет преимущество получения содержимого в сети. Некоторые напоминания об этой политике:
- Путь к файлу к альтернативному источнику должен быть полным путем. Несколько расположений можно разделить точкой с запятой.
- Этот параметр не поддерживает установку языковых пакетов из альтернативного пути к исходному файлу, только функции по запросу. Если политика настроена для получения содержимого из клиентский компонент Центра обновления Windows, будут получены языковые пакеты.
- Если этот параметр не настроен или отключен, файлы скачиваются из расположения по умолчанию клиентский компонент Центра обновления Windows, например клиентский компонент Центра обновления Windows клиентских политик или WSUS.
Дополнительные сведения см. в разделах Настройка источника восстановления Windows и Как сделать функции по запросу и языковые пакеты доступными при использовании WSUS или Configuration Manager.
Дополнительные ресурсы
Дополнительные сведения о единой платформе обновлений и подходах, описанных в этой статье, см. в следующих ресурсах:
- Планирование развертывания WSUS
- /InstallLangPacks
- /DynamicUpdate
- Настройка источника восстановления Windows
- Выполнение пользовательских действий во время обновления компонентов
- Единая платформа обновлений
- Обновление установочного носителя Windows с помощью пакетов динамического обновления
- Обзор автоматизации установки Windows
Образцы сценариев
Варианты 4 и 6 предполагают наибольшее использование скриптов. Примеры скриптов для варианта 4 уже существуют, поэтому давайте рассмотрим примеры скриптов для варианта 6: установка дополнительного содержимого после развертывания.
Создание необязательного репозитория содержимого
Чтобы приступить к работе, мы создадим репозиторий с дополнительным содержимым и размещением в общей сетевой папке. Это подмножество содержимого из ОБЪЕКТОВ ISOS FOD и языковых пакетов, которые поставляются с каждым выпуском. Мы настраиваем этот репозиторий или репозиторий только с теми FOD, которые нужны нашей организации, с помощью DISM /Export. Например, надмножество, основанное на инвентаризации дополнительных компонентов, установленных на существующих устройствах. В этом случае мы исключаем функцию Windows Mixed Reality. Кроме того, мы копируем все языковые пакеты в корень репозитория.
# Declare media for FOD and LPs
$LP_ISO_PATH = "C:\_IMAGE\2004_ISO\CLIENTLANGPACKDVD_OEM_MULTI.iso"
$FOD_ISO_PATH = "C:\_IMAGE\2004_ISO\FOD-PACKAGES_OEM_PT1_amd64fre_MULTI.iso"
# Declare folders
$WORKING_PATH = "C:\_IMAGE\BuildRepo"
$MEDIA_PATH = "C:\_IMAGE\2004_SETUP"
$MAIN_OS_MOUNT = $WORKING_PATH + "\MainOSMount"
$REPO_PATH = $WORKING_PATH + "\Repo"
# Create folders for mounting image optional content repository
if (Test-Path $MAIN_OS_MOUNT) {
Remove-Item -Path $MAIN_OS_MOUNT -Force -Recurse -ErrorAction stop| Out-Null
}
if (Test-Path $REPO_PATH) {
Remove-Item -Path $REPO_PATH -Force -Recurse -ErrorAction stop| Out-Null
}
New-Item -ItemType Directory -Force -Path $MAIN_OS_MOUNT -ErrorAction stop| Out-Null
New-Item -ItemType Directory -Force -Path $REPO_PATH -ErrorAction stop| Out-Null
# Mount the main OS, I'll use this throughout the script
Write-Host "Mounting main OS"
Mount-WindowsImage -ImagePath $MEDIA_PATH"\sources\install.wim" -Index 1 -Path $MAIN_OS_MOUNT -ErrorAction stop| Out-Null
# Mount the LP ISO
Write-Host "Mounting LP ISO"
$LP_ISO_DRIVE_LETTER = (Mount-DiskImage -ImagePath $LP_ISO_PATH -ErrorAction stop | Get-Volume).DriveLetter
# Declare language related cabs
$OS_LP_PATH = $LP_ISO_DRIVE_LETTER + ":\x64\langpacks\" + "*.cab"
# Mount the FOD ISO
Write-Host "Mounting FOD ISO"
$FOD_ISO_DRIVE_LETTER = (Mount-DiskImage -ImagePath $FOD_ISO_PATH -ErrorAction stop | Get-Volume).DriveLetter
$FOD_PATH = $FOD_ISO_DRIVE_LETTER + ":\"
# Export the FODs from the ISO that we are interested in
Write-Host "Exporting FODs to Repo"
DISM /image:$MAIN_OS_MOUNT /export-source /source:$FOD_PATH /target:$REPO_PATH `
/capabilityname:Accessibility.Braille~~~~0.0.1.0 `
/capabilityname:App.StepsRecorder~~~~0.0.1.0 `
/capabilityname:App.WirelessDisplay.Connect~~~~0.0.1.0 `
/capabilityname:Browser.InternetExplorer~~~~0.0.11.0 `
/capabilityname:DirectX.Configuration.Database~~~~0.0.1.0 `
/capabilityname:Language.Basic~~~af-za~0.0.1.0 `
/capabilityname:Language.Basic~~~ar-sa~0.0.1.0 `
/capabilityname:Language.Basic~~~as-in~0.0.1.0 `
/capabilityname:Language.Basic~~~az-latn-az~0.0.1.0 `
/capabilityname:Language.Basic~~~ba-ru~0.0.1.0 `
/capabilityname:Language.Basic~~~be-by~0.0.1.0 `
/capabilityname:Language.Basic~~~bg-bg~0.0.1.0 `
/capabilityname:Language.Basic~~~bn-bd~0.0.1.0 `
/capabilityname:Language.Basic~~~bn-in~0.0.1.0 `
/capabilityname:Language.Basic~~~bs-latn-ba~0.0.1.0 `
/capabilityname:Language.Basic~~~ca-es~0.0.1.0 `
/capabilityname:Language.Basic~~~cs-cz~0.0.1.0 `
/capabilityname:Language.Basic~~~cy-gb~0.0.1.0 `
/capabilityname:Language.Basic~~~da-dk~0.0.1.0 `
/capabilityname:Language.Basic~~~de-ch~0.0.1.0 `
/capabilityname:Language.Basic~~~de-de~0.0.1.0 `
/capabilityname:Language.Basic~~~el-gr~0.0.1.0 `
/capabilityname:Language.Basic~~~en-au~0.0.1.0 `
/capabilityname:Language.Basic~~~en-ca~0.0.1.0 `
/capabilityname:Language.Basic~~~en-gb~0.0.1.0 `
/capabilityname:Language.Basic~~~en-in~0.0.1.0 `
/capabilityname:Language.Basic~~~en-us~0.0.1.0 `
/capabilityname:Language.Basic~~~es-es~0.0.1.0 `
/capabilityname:Language.Basic~~~es-mx~0.0.1.0 `
/capabilityname:Language.Basic~~~es-us~0.0.1.0 `
/capabilityname:Language.Basic~~~et-ee~0.0.1.0 `
/capabilityname:Language.Basic~~~eu-es~0.0.1.0 `
/capabilityname:Language.Basic~~~fa-ir~0.0.1.0 `
/capabilityname:Language.Basic~~~fi-fi~0.0.1.0 `
/capabilityname:Language.Basic~~~fil-ph~0.0.1.0 `
/capabilityname:Language.Basic~~~fr-be~0.0.1.0 `
/capabilityname:Language.Basic~~~fr-ca~0.0.1.0 `
/capabilityname:Language.Basic~~~fr-ch~0.0.1.0 `
/capabilityname:Language.Basic~~~fr-fr~0.0.1.0 `
/capabilityname:Language.Basic~~~ga-ie~0.0.1.0 `
/capabilityname:Language.Basic~~~gd-gb~0.0.1.0 `
/capabilityname:Language.Basic~~~gl-es~0.0.1.0 `
/capabilityname:Language.Basic~~~gu-in~0.0.1.0 `
/capabilityname:Language.Basic~~~ha-latn-ng~0.0.1.0 `
/capabilityname:Language.Basic~~~haw-us~0.0.1.0 `
/capabilityname:Language.Basic~~~he-il~0.0.1.0 `
/capabilityname:Language.Basic~~~hi-in~0.0.1.0 `
/capabilityname:Language.Basic~~~hr-hr~0.0.1.0 `
/capabilityname:Language.Basic~~~hu-hu~0.0.1.0 `
/capabilityname:Language.Basic~~~hy-am~0.0.1.0 `
/capabilityname:Language.Basic~~~id-id~0.0.1.0 `
/capabilityname:Language.Basic~~~ig-ng~0.0.1.0 `
/capabilityname:Language.Basic~~~is-is~0.0.1.0 `
/capabilityname:Language.Basic~~~it-it~0.0.1.0 `
/capabilityname:Language.Basic~~~ja-jp~0.0.1.0 `
/capabilityname:Language.Basic~~~ka-ge~0.0.1.0 `
/capabilityname:Language.Basic~~~kk-kz~0.0.1.0 `
/capabilityname:Language.Basic~~~kl-gl~0.0.1.0 `
/capabilityname:Language.Basic~~~kn-in~0.0.1.0 `
/capabilityname:Language.Basic~~~kok-deva-in~0.0.1.0 `
/capabilityname:Language.Basic~~~ko-kr~0.0.1.0 `
/capabilityname:Language.Basic~~~ky-kg~0.0.1.0 `
/capabilityname:Language.Basic~~~lb-lu~0.0.1.0 `
/capabilityname:Language.Basic~~~lt-lt~0.0.1.0 `
/capabilityname:Language.Basic~~~lv-lv~0.0.1.0 `
/capabilityname:Language.Basic~~~mi-nz~0.0.1.0 `
/capabilityname:Language.Basic~~~mk-mk~0.0.1.0 `
/capabilityname:Language.Basic~~~ml-in~0.0.1.0 `
/capabilityname:Language.Basic~~~mn-mn~0.0.1.0 `
/capabilityname:Language.Basic~~~mr-in~0.0.1.0 `
/capabilityname:Language.Basic~~~ms-bn~0.0.1.0 `
/capabilityname:Language.Basic~~~ms-my~0.0.1.0 `
/capabilityname:Language.Basic~~~mt-mt~0.0.1.0 `
/capabilityname:Language.Basic~~~nb-no~0.0.1.0 `
/capabilityname:Language.Basic~~~ne-np~0.0.1.0 `
/capabilityname:Language.Basic~~~nl-nl~0.0.1.0 `
/capabilityname:Language.Basic~~~nn-no~0.0.1.0 `
/capabilityname:Language.Basic~~~nso-za~0.0.1.0 `
/capabilityname:Language.Basic~~~or-in~0.0.1.0 `
/capabilityname:Language.Basic~~~pa-in~0.0.1.0 `
/capabilityname:Language.Basic~~~pl-pl~0.0.1.0 `
/capabilityname:Language.Basic~~~ps-af~0.0.1.0 `
/capabilityname:Language.Basic~~~pt-br~0.0.1.0 `
/capabilityname:Language.Basic~~~pt-pt~0.0.1.0 `
/capabilityname:Language.Basic~~~rm-ch~0.0.1.0 `
/capabilityname:Language.Basic~~~ro-ro~0.0.1.0 `
/capabilityname:Language.Basic~~~ru-ru~0.0.1.0 `
/capabilityname:Language.Basic~~~rw-rw~0.0.1.0 `
/capabilityname:Language.Basic~~~sah-ru~0.0.1.0 `
/capabilityname:Language.Basic~~~si-lk~0.0.1.0 `
/capabilityname:Language.Basic~~~sk-sk~0.0.1.0 `
/capabilityname:Language.Basic~~~sl-si~0.0.1.0 `
/capabilityname:Language.Basic~~~sq-al~0.0.1.0 `
/capabilityname:Language.Basic~~~sr-cyrl-rs~0.0.1.0 `
/capabilityname:Language.Basic~~~sr-latn-rs~0.0.1.0 `
/capabilityname:Language.Basic~~~sv-se~0.0.1.0 `
/capabilityname:Language.Basic~~~sw-ke~0.0.1.0 `
/capabilityname:Language.Basic~~~ta-in~0.0.1.0 `
/capabilityname:Language.Basic~~~te-in~0.0.1.0 `
/capabilityname:Language.Basic~~~tg-cyrl-tj~0.0.1.0 `
/capabilityname:Language.Basic~~~th-th~0.0.1.0 `
/capabilityname:Language.Basic~~~tk-tm~0.0.1.0 `
/capabilityname:Language.Basic~~~tn-za~0.0.1.0 `
/capabilityname:Language.Basic~~~tr-tr~0.0.1.0 `
/capabilityname:Language.Basic~~~tt-ru~0.0.1.0 `
/capabilityname:Language.Basic~~~ug-cn~0.0.1.0 `
/capabilityname:Language.Basic~~~uk-ua~0.0.1.0 `
/capabilityname:Language.Basic~~~ur-pk~0.0.1.0 `
/capabilityname:Language.Basic~~~uz-latn-uz~0.0.1.0 `
/capabilityname:Language.Basic~~~vi-vn~0.0.1.0 `
/capabilityname:Language.Basic~~~wo-sn~0.0.1.0 `
/capabilityname:Language.Basic~~~xh-za~0.0.1.0 `
/capabilityname:Language.Basic~~~yo-ng~0.0.1.0 `
/capabilityname:Language.Basic~~~zh-cn~0.0.1.0 `
/capabilityname:Language.Basic~~~zh-hk~0.0.1.0 `
/capabilityname:Language.Basic~~~zh-tw~0.0.1.0 `
/capabilityname:Language.Basic~~~zu-za~0.0.1.0 `
/capabilityname:Language.Fonts.Arab~~~und-Arab~0.0.1.0 `
/capabilityname:Language.Fonts.Beng~~~und-Beng~0.0.1.0 `
/capabilityname:Language.Fonts.Cans~~~und-Cans~0.0.1.0 `
/capabilityname:Language.Fonts.Cher~~~und-Cher~0.0.1.0 `
/capabilityname:Language.Fonts.Deva~~~und-Deva~0.0.1.0 `
/capabilityname:Language.Fonts.Ethi~~~und-Ethi~0.0.1.0 `
/capabilityname:Language.Fonts.Gujr~~~und-Gujr~0.0.1.0 `
/capabilityname:Language.Fonts.Guru~~~und-Guru~0.0.1.0 `
/capabilityname:Language.Fonts.Hans~~~und-Hans~0.0.1.0 `
/capabilityname:Language.Fonts.Hant~~~und-Hant~0.0.1.0 `
/capabilityname:Language.Fonts.Hebr~~~und-Hebr~0.0.1.0 `
/capabilityname:Language.Fonts.Jpan~~~und-Jpan~0.0.1.0 `
/capabilityname:Language.Fonts.Khmr~~~und-Khmr~0.0.1.0 `
/capabilityname:Language.Fonts.Knda~~~und-Knda~0.0.1.0 `
/capabilityname:Language.Fonts.Kore~~~und-Kore~0.0.1.0 `
/capabilityname:Language.Fonts.Laoo~~~und-Laoo~0.0.1.0 `
/capabilityname:Language.Fonts.Mlym~~~und-Mlym~0.0.1.0 `
/capabilityname:Language.Fonts.Orya~~~und-Orya~0.0.1.0 `
/capabilityname:Language.Fonts.PanEuropeanSupplementalFonts~~~0.0.1.0 `
/capabilityname:Language.Fonts.Sinh~~~und-Sinh~0.0.1.0 `
/capabilityname:Language.Fonts.Syrc~~~und-Syrc~0.0.1.0 `
/capabilityname:Language.Fonts.Taml~~~und-Taml~0.0.1.0 `
/capabilityname:Language.Fonts.Telu~~~und-Telu~0.0.1.0 `
/capabilityname:Language.Fonts.Thai~~~und-Thai~0.0.1.0 `
/capabilityname:Language.Handwriting~~~af-za~0.0.1.0 `
/capabilityname:Language.Handwriting~~~bs-latn-ba~0.0.1.0 `
/capabilityname:Language.Handwriting~~~ca-es~0.0.1.0 `
/capabilityname:Language.Handwriting~~~cs-cz~0.0.1.0 `
/capabilityname:Language.Handwriting~~~cy-gb~0.0.1.0 `
/capabilityname:Language.Handwriting~~~da-dk~0.0.1.0 `
/capabilityname:Language.Handwriting~~~de-de~0.0.1.0 `
/capabilityname:Language.Handwriting~~~el-gr~0.0.1.0 `
/capabilityname:Language.Handwriting~~~en-gb~0.0.1.0 `
/capabilityname:Language.Handwriting~~~en-us~0.0.1.0 `
/capabilityname:Language.Handwriting~~~es-es~0.0.1.0 `
/capabilityname:Language.Handwriting~~~es-mx~0.0.1.0 `
/capabilityname:Language.Handwriting~~~eu-es~0.0.1.0 `
/capabilityname:Language.Handwriting~~~fi-fi~0.0.1.0 `
/capabilityname:Language.Handwriting~~~fr-fr~0.0.1.0 `
/capabilityname:Language.Handwriting~~~ga-ie~0.0.1.0 `
/capabilityname:Language.Handwriting~~~gd-gb~0.0.1.0 `
/capabilityname:Language.Handwriting~~~gl-es~0.0.1.0 `
/capabilityname:Language.Handwriting~~~hi-in~0.0.1.0 `
/capabilityname:Language.Handwriting~~~hr-hr~0.0.1.0 `
/capabilityname:Language.Handwriting~~~id-id~0.0.1.0 `
/capabilityname:Language.Handwriting~~~it-it~0.0.1.0 `
/capabilityname:Language.Handwriting~~~ja-jp~0.0.1.0 `
/capabilityname:Language.Handwriting~~~ko-kr~0.0.1.0 `
/capabilityname:Language.Handwriting~~~lb-lu~0.0.1.0 `
/capabilityname:Language.Handwriting~~~mi-nz~0.0.1.0 `
/capabilityname:Language.Handwriting~~~ms-bn~0.0.1.0 `
/capabilityname:Language.Handwriting~~~ms-my~0.0.1.0 `
/capabilityname:Language.Handwriting~~~nb-no~0.0.1.0 `
/capabilityname:Language.Handwriting~~~nl-nl~0.0.1.0 `
/capabilityname:Language.Handwriting~~~nn-no~0.0.1.0 `
/capabilityname:Language.Handwriting~~~nso-za~0.0.1.0 `
/capabilityname:Language.Handwriting~~~pl-pl~0.0.1.0 `
/capabilityname:Language.Handwriting~~~pt-br~0.0.1.0 `
/capabilityname:Language.Handwriting~~~pt-pt~0.0.1.0 `
/capabilityname:Language.Handwriting~~~rm-ch~0.0.1.0 `
/capabilityname:Language.Handwriting~~~ro-ro~0.0.1.0 `
/capabilityname:Language.Handwriting~~~ru-ru~0.0.1.0 `
/capabilityname:Language.Handwriting~~~rw-rw~0.0.1.0 `
/capabilityname:Language.Handwriting~~~sk-sk~0.0.1.0 `
/capabilityname:Language.Handwriting~~~sl-si~0.0.1.0 `
/capabilityname:Language.Handwriting~~~sq-al~0.0.1.0 `
/capabilityname:Language.Handwriting~~~sr-cyrl-rs~0.0.1.0 `
/capabilityname:Language.Handwriting~~~sr-latn-rs~0.0.1.0 `
/capabilityname:Language.Handwriting~~~sv-se~0.0.1.0 `
/capabilityname:Language.Handwriting~~~sw-ke~0.0.1.0 `
/capabilityname:Language.Handwriting~~~tn-za~0.0.1.0 `
/capabilityname:Language.Handwriting~~~tr-tr~0.0.1.0 `
/capabilityname:Language.Handwriting~~~wo-sn~0.0.1.0 `
/capabilityname:Language.Handwriting~~~xh-za~0.0.1.0 `
/capabilityname:Language.Handwriting~~~zh-cn~0.0.1.0 `
/capabilityname:Language.Handwriting~~~zh-hk~0.0.1.0 `
/capabilityname:Language.Handwriting~~~zh-tw~0.0.1.0 `
/capabilityname:Language.Handwriting~~~zu-za~0.0.1.0 `
/capabilityname:Language.LocaleData~~~zh-tw~0.0.1.0 `
/capabilityname:Language.OCR~~~ar-sa~0.0.1.0 `
/capabilityname:Language.OCR~~~bg-bg~0.0.1.0 `
/capabilityname:Language.OCR~~~bs-latn-ba~0.0.1.0 `
/capabilityname:Language.OCR~~~cs-cz~0.0.1.0 `
/capabilityname:Language.OCR~~~da-dk~0.0.1.0 `
/capabilityname:Language.OCR~~~de-de~0.0.1.0 `
/capabilityname:Language.OCR~~~el-gr~0.0.1.0 `
/capabilityname:Language.OCR~~~en-gb~0.0.1.0 `
/capabilityname:Language.OCR~~~en-us~0.0.1.0 `
/capabilityname:Language.OCR~~~es-es~0.0.1.0 `
/capabilityname:Language.OCR~~~es-mx~0.0.1.0 `
/capabilityname:Language.OCR~~~fi-fi~0.0.1.0 `
/capabilityname:Language.OCR~~~fr-ca~0.0.1.0 `
/capabilityname:Language.OCR~~~fr-fr~0.0.1.0 `
/capabilityname:Language.OCR~~~hr-hr~0.0.1.0 `
/capabilityname:Language.OCR~~~hu-hu~0.0.1.0 `
/capabilityname:Language.OCR~~~it-it~0.0.1.0 `
/capabilityname:Language.OCR~~~ja-jp~0.0.1.0 `
/capabilityname:Language.OCR~~~ko-kr~0.0.1.0 `
/capabilityname:Language.OCR~~~nb-no~0.0.1.0 `
/capabilityname:Language.OCR~~~nl-nl~0.0.1.0 `
/capabilityname:Language.OCR~~~pl-pl~0.0.1.0 `
/capabilityname:Language.OCR~~~pt-br~0.0.1.0 `
/capabilityname:Language.OCR~~~pt-pt~0.0.1.0 `
/capabilityname:Language.OCR~~~ro-ro~0.0.1.0 `
/capabilityname:Language.OCR~~~ru-ru~0.0.1.0 `
/capabilityname:Language.OCR~~~sk-sk~0.0.1.0 `
/capabilityname:Language.OCR~~~sl-si~0.0.1.0 `
/capabilityname:Language.OCR~~~sr-cyrl-rs~0.0.1.0 `
/capabilityname:Language.OCR~~~sr-latn-rs~0.0.1.0 `
/capabilityname:Language.OCR~~~sv-se~0.0.1.0 `
/capabilityname:Language.OCR~~~tr-tr~0.0.1.0 `
/capabilityname:Language.OCR~~~zh-cn~0.0.1.0 `
/capabilityname:Language.OCR~~~zh-hk~0.0.1.0 `
/capabilityname:Language.OCR~~~zh-tw~0.0.1.0 `
/capabilityname:Language.Speech~~~da-dk~0.0.1.0 `
/capabilityname:Language.Speech~~~de-de~0.0.1.0 `
/capabilityname:Language.Speech~~~en-au~0.0.1.0 `
/capabilityname:Language.Speech~~~en-ca~0.0.1.0 `
/capabilityname:Language.Speech~~~en-gb~0.0.1.0 `
/capabilityname:Language.Speech~~~en-in~0.0.1.0 `
/capabilityname:Language.Speech~~~en-us~0.0.1.0 `
/capabilityname:Language.Speech~~~es-es~0.0.1.0 `
/capabilityname:Language.Speech~~~es-mx~0.0.1.0 `
/capabilityname:Language.Speech~~~fr-ca~0.0.1.0 `
/capabilityname:Language.Speech~~~fr-fr~0.0.1.0 `
/capabilityname:Language.Speech~~~it-it~0.0.1.0 `
/capabilityname:Language.Speech~~~ja-jp~0.0.1.0 `
/capabilityname:Language.Speech~~~pt-br~0.0.1.0 `
/capabilityname:Language.Speech~~~zh-cn~0.0.1.0 `
/capabilityname:Language.Speech~~~zh-hk~0.0.1.0 `
/capabilityname:Language.Speech~~~zh-tw~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~ar-eg~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~ar-sa~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~bg-bg~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~ca-es~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~cs-cz~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~da-dk~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~de-at~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~de-ch~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~de-de~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~el-gr~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~en-au~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~en-ca~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~en-gb~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~en-ie~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~en-in~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~en-us~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~es-es~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~es-mx~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~fi-fi~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~fr-ca~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~fr-ch~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~fr-fr~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~he-il~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~hi-in~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~hr-hr~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~hu-hu~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~id-id~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~it-it~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~ja-jp~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~ko-kr~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~ms-my~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~nb-no~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~nl-be~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~nl-nl~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~pl-pl~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~pt-br~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~pt-pt~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~ro-ro~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~ru-ru~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~sk-sk~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~sl-si~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~sv-se~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~ta-in~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~th-th~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~tr-tr~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~vi-vn~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~zh-cn~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~zh-hk~0.0.1.0 `
/capabilityname:Language.TextToSpeech~~~zh-tw~0.0.1.0 `
/capabilityname:MathRecognizer~~~~0.0.1.0 `
/capabilityname:Microsoft.Onecore.StorageManagement~~~~0.0.1.0 `
/capabilityname:Microsoft.WebDriver~~~~0.0.1.0 `
/capabilityname:Microsoft.Windows.MSPaint~~~~0.0.1.0 `
/capabilityname:Microsoft.Windows.Notepad~~~~0.0.1.0 `
/capabilityname:Microsoft.Windows.PowerShell.ISE~~~~0.0.1.0 `
/capabilityname:Microsoft.Windows.StorageManagement~~~~0.0.1.0 `
/capabilityname:Microsoft.Windows.WordPad~~~~0.0.1.0 `
/capabilityname:Msix.PackagingTool.Driver~~~~0.0.1.0 `
/capabilityname:NetFX3~~ `
/capabilityname:Network.Irda~~~~0.0.1.0 `
/capabilityname:OneCoreUAP.OneSync~~~~0.0.1.0 `
/capabilityname:OpenSSH.Client~~~~0.0.1.0 `
/capabilityname:OpenSSH.Server~~~~0.0.1.0 `
/capabilityname:Print.EnterpriseCloudPrint~~~~0.0.1.0 `
/capabilityname:Print.Fax.Scan~~~~0.0.1.0 `
/capabilityname:Print.Management.Console~~~~0.0.1.0 `
/capabilityname:Print.MopriaCloudService~~~~0.0.1.0 `
/capabilityname:RasCMAK.Client~~~~0.0.1.0 `
/capabilityname:RIP.Listener~~~~0.0.1.0 `
/capabilityname:Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0 `
/capabilityname:Rsat.BitLocker.Recovery.Tools~~~~0.0.1.0 `
/capabilityname:Rsat.CertificateServices.Tools~~~~0.0.1.0 `
/capabilityname:Rsat.DHCP.Tools~~~~0.0.1.0 `
/capabilityname:Rsat.Dns.Tools~~~~0.0.1.0 `
/capabilityname:Rsat.FailoverCluster.Management.Tools~~~~0.0.1.0 `
/capabilityname:Rsat.FileServices.Tools~~~~0.0.1.0 `
/capabilityname:Rsat.GroupPolicy.Management.Tools~~~~0.0.1.0 `
/capabilityname:Rsat.IPAM.Client.Tools~~~~0.0.1.0 `
/capabilityname:Rsat.LLDP.Tools~~~~0.0.1.0 `
/capabilityname:Rsat.NetworkController.Tools~~~~0.0.1.0 `
/capabilityname:Rsat.NetworkLoadBalancing.Tools~~~~0.0.1.0 `
/capabilityname:Rsat.RemoteAccess.Management.Tools~~~~0.0.1.0 `
/capabilityname:Rsat.RemoteDesktop.Services.Tools~~~~0.0.1.0 `
/capabilityname:Rsat.ServerManager.Tools~~~~0.0.1.0 `
/capabilityname:Rsat.Shielded.VM.Tools~~~~0.0.1.0 `
/capabilityname:Rsat.StorageMigrationService.Management.Tools~~~~0.0.1.0 `
/capabilityname:Rsat.StorageReplica.Tools~~~~0.0.1.0 `
/capabilityname:Rsat.SystemInsights.Management.Tools~~~~0.0.1.0 `
/capabilityname:Rsat.VolumeActivation.Tools~~~~0.0.1.0 `
/capabilityname:Rsat.WSUS.Tools~~~~0.0.1.0 `
/capabilityname:ServerCore.AppCompatibility~~~~0.0.1.0 `
/capabilityname:SNMP.Client~~~~0.0.1.0 `
/capabilityname:Tools.DeveloperMode.Core~~~~0.0.1.0 `
/capabilityname:Tools.Graphics.DirectX~~~~0.0.1.0 `
/capabilityname:Windows.Client.ShellComponents~~~~0.0.1.0 `
/capabilityname:Windows.Desktop.EMS-SAC.Tools~~~~0.0.1.0 `
/capabilityname:WMI-SNMP-Provider.Client~~~~0.0.1.0 `
/capabilityname:XPS.Viewer~~~~0.0.1.0
# This one is large, lets skip for now
#/capabilityname:Analog.Holographic.Desktop~~~~0.0.1.0 `
# Copy language caps to the repo
Copy-Item -Path $OS_LP_PATH -Destination $REPO_PATH -Force -ErrorAction stop | Out-Null
# Dismount OS image
Dismount-WindowsImage -Path $MAIN_OS_MOUNT -Discard -ErrorAction ignore | Out-Null
# Dismount ISO images
Write-Host "Dismounting ISO images"
Dismount-DiskImage -ImagePath $LP_ISO_PATH -ErrorAction ignore | Out-Null
Dismount-DiskImage -ImagePath $FOD_ISO_PATH -ErrorAction ignore | Out-Null
Сохранение необязательного содержимого в исходной операционной системе
Чтобы сохранить необязательное состояние содержимого в исходной операционной системе, мы создадим скрипт пользовательского действия, который будет выполняться перед установкой операционной системы. В этом сценарии мы сохраняем дополнительные функции и языковые ресурсы в файл. Кроме того, мы создаем локальную копию репозитория с необходимыми файлами на основе языков, установленных в исходной операционной системе. Это действие ограничивает копирование файлов.
$OUTPUT_PATH = "C:\TEMP\"
$LOG_PATH = $OUTPUT_PATH + "log.txt"
$OUTPUT_PATH = "C:\TEMP\"
$LOG_PATH = $OUTPUT_PATH + "log.txt"
$LANG_PATH = $OUTPUT_PATH + "sourceLang.txt"
$CAP_PATH = $OUTPUT_PATH + "sourceCapability.txt"
$OSVERSION_PATH = $OUTPUT_PATH + "sourceVersion.txt"
$REPO_PATH = "Z:\Repo\"
$LOCAL_REPO_PATH = $OUTPUT_PATH + "Local_Repo\"
Function Get-TS { return "{0:HH:mm:ss}" -f (Get-Date) }
Function Log
{
param (
[Parameter(Mandatory=$True)]
[string]$MESSAGE
)
$M = "$(Get-TS): PreInstall: $MESSAGE"
Write-Host $M
Add-Content -Path $LOG_PATH -Value $M
}
Function IsLangFile
{
param (
[Parameter(Mandatory=$True)]
[string]$PATH
)
if (($PATH -match '[-_~]ar[-_~]') -or ($PATH -match '[-_~]bg[-_~]') -or ($PATH -match '[-_~]cs[-_~]') -or `
($PATH -match '[-_~]da[-_~]') -or ($PATH -match '[-_~]de[-_~]') -or ($PATH -match '[-_~]el[-_~]') -or `
($PATH -match '[-_~]en[-_~]') -or ($PATH -match '[-_~]es[-_~]') -or ($PATH -match '[-_~]et[-_~]') -or `
($PATH -match '[-_~]fi[-_~]') -or ($PATH -match '[-_~]fr[-_~]') -or ($PATH -match '[-_~]he[-_~]') -or `
($PATH -match '[-_~]hr[-_~]') -or ($PATH -match '[-_~]hu[-_~]') -or ($PATH -match '[-_~]it[-_~]') -or `
($PATH -match '[-_~]ja[-_~]') -or ($PATH -match '[-_~]ko[-_~]') -or ($PATH -match '[-_~]lt[-_~]') -or `
($PATH -match '[-_~]lv[-_~]') -or ($PATH -match '[-_~]nb[-_~]') -or ($PATH -match '[-_~]nl[-_~]') -or `
($PATH -match '[-_~]pl[-_~]') -or ($PATH -match '[-_~]pt[-_~]') -or ($PATH -match '[-_~]ro[-_~]') -or `
($PATH -match '[-_~]ru[-_~]') -or ($PATH -match '[-_~]sk[-_~]') -or ($PATH -match '[-_~]sl[-_~]') -or `
($PATH -match '[-_~]sv[-_~]') -or ($PATH -match '[-_~]th[-_~]') -or ($PATH -match '[-_~]tr[-_~]') -or `
($PATH -match '[-_~]uk[-_~]') -or ($PATH -match '[-_~]zh[-_~]') -or ($PATH -match '[-_~]sr[-_~]')) {
return $True
}
else {
return $False
}
}
# Remove the log
Remove-Item -Path $LOG_PATH -Force -ErrorAction ignore | Out-Null
Log "Starting"
# Remove state files, keep repo if it exists
Remove-Item -Path $LANG_PATH -Force -ErrorAction ignore | Out-Null
Remove-Item -Path $CAP_PATH -Force -ErrorAction ignore | Out-Null
Remove-Item -Path $OSVERSION_PATH -Force -ErrorAction ignore | Out-Null
# Get OS version, to use later for detecting compat scans versus OS installation
$OSINFO = Get-CimInstance Win32_OperatingSystem
Log "OS Version: $($OSINFO.Version)"
Add-Content -Path $OSVERSION_PATH -Value $OSINFO.Version
# Get installed languages from international settings
$INTL = DISM.exe /Online /Get-Intl /English
# Save only output lines with installed languages
$LANGUAGES = $INTL | Select-String -SimpleMatch 'Installed language(s)'
# Replace with null so we have a simple list of language codes
$LANGUAGES = $LANGUAGES | ForEach-Object {$_.Line.Replace("Installed language(s): ","")}
# Save System Language, save only output line with default system language
$SYSLANG = $INTL | Select-String -SimpleMatch 'Default system UI language'
# Replace with null so we have the language code
$SYSLANG = $SYSLANG | ForEach-Object {$_.Line.Replace("Default system UI language : ","")}
# Save these languages
Log "Default system UI language on source OS: $($SYSLANG)"
ForEach ($ITEM in $LANGUAGES) {
Log "Installed language on source OS: $($ITEM)"
Add-Content -Path $LANG_PATH -Value $ITEM
}
# Get and save installed packages, we'll use this for debugging
$PACKAGES = Get-WindowsPackage -Online
ForEach ($ITEM in $PACKAGES) {
if($ITEM.PackageState -eq "Installed") {
Log "Package $($ITEM.PackageName) is installed"
}
}
# Get and save capabilities
$CAPABILITIES = Get-WindowsCapability -Online
ForEach ($ITEM in $CAPABILITIES) {
if($ITEM.State -eq "Installed") {
Log "Capability $($ITEM.Name) is installed"
Add-Content -Path $CAP_PATH -Value $ITEM.Name
}
}
# Copy a subset of the Repo files locally, all neutral files and the languages needed
$REPO_FILES = Get-ChildItem $REPO_PATH -file -Recurse
ForEach ($FILE in $REPO_FILES) {
$PATH = ($FILE.DirectoryName + "\") -Replace [Regex]::Escape($REPO_PATH), $LOCAL_REPO_PATH
If (!(Test-Path $Path)) {
New-Item -ItemType Directory -Path $PATH -Force | Out-Null
}
If ((IsLangFile $FILE.Name)) {
# Only copy those files where we need the primary languages from the source OS
ForEach ($ITEM in $LANGUAGES) {
if ($FILE.Name -match $Item) {
If (!(Test-Path (Join-Path $Path $File.Name))) {
Copy-Item $FILE.FullName -Destination $PATH -Force
Log "Copied file $($FILE.FullName) to local repository"
}
else {
Log "File $($FILE.Name) already exists in local repository"
}
}
}
} Else {
# Copy all 'neutral files' and those language specific that are not in the core 38
If (!(Test-Path (Join-Path $Path $File.Name))) {
Copy-Item $FILE.FullName -Destination $PATH -Force
Log "Copied file $($FILE.FullName) to local repository"
}
else {
Log "File $($FILE.Name) already exists in local repository"
}
}
}
Log ("Exiting")
Добавление дополнительного содержимого в целевую операционную систему
После успешного завершения установки мы используем success.cmd для получения необязательного состояния содержимого из исходной операционной системы и установки в новой операционной системе только в том случае, если оно отсутствует. Затем примените последнее ежемесячное обновление в качестве последнего шага.
$OUTPUT_PATH = "C:\TEMP\"
$LOG_PATH = $OUTPUT_PATH + "log.txt"
$LANG_PATH = $OUTPUT_PATH + "sourceLang.txt"
$CAP_PATH = $OUTPUT_PATH + "sourceCapability.txt"
$OSVERSION_PATH = $OUTPUT_PATH + "sourceVersion.txt"
$LOCAL_REPO_PATH = $OUTPUT_PATH + "Local_Repo\"
$LCU_PATH = $OUTPUT_PATH + "Windows10.0-KB4565503-x64_PSFX.cab"
$PENDING = $false
Function Get-TS { return "{0:HH:mm:ss}" -f (Get-Date) }
Function Log
{
param (
[Parameter(Mandatory=$True)]
[string]$MESSAGE
)
$M = "$(Get-TS): PostInstall: $MESSAGE"
Write-Host $M
Add-Content -Path $LOG_PATH -Value $M
}
Log "Starting"
# Get OS version
$OSINFO = Get-CimInstance Win32_OperatingSystem
Log "OS Version: $($OSINFO.Version)"
# Check for source OS state, just to be sure
if (!(Test-Path $LANG_PATH) -or !(Test-Path $CAP_PATH) -or !(Test-Path $OSVERSION_PATH) ) {
Log "Source OS state is missing."
}
# If this script is executing and the OS version hasn't changed, let's exit out.
else {
# Retrive OS version from source OS
$SOURCE_OSVERSION = Get-Content -Path $OSVERSION_PATH
if ($OSINFO.Version -eq $SOURCE_OSVERSION) {
Log "OS Version hasn't changed."
}
else {
# Retrive language list from source OS
$SOURCE_LANGUAGES = Get-Content -Path $LANG_PATH
# Get installed languages from International Settings
$INTL = DISM.exe /Online /Get-Intl /English
# Save System Language, save only output line with default system language
$SYS_LANG = $INTL | Select-String -SimpleMatch 'Default system UI language'
# Replace with null so we have the language code
$SYS_LANG = $SYS_LANG | ForEach-Object {$_.Line.Replace("Default system UI language : ","")}
# Get and save installed packages, we'll use this for debugging
$PACKAGES = Get-WindowsPackage -Online
ForEach ($ITEM in $PACKAGES) {
if($ITEM.PackageState -eq "Installed") {
Log "Package $($ITEM.PackageName) is installed"
}
}
# Loop through source OS languages, and install if missing on target OS
ForEach ($SOURCE_ITEM in $SOURCE_LANGUAGES) {
if ($SOURCE_ITEM -ne $SYS_LANG) {
# add missing languages except the system language
Log "Adding language Microsoft-Windows-Client-Language-Pack_x64_$($SOURCE_ITEM).cab"
try {
Add-WindowsPackage -Online -PackagePath "$($LOCAL_REPO_PATH)\Microsoft-Windows-Client-Language-Pack_x64_$($SOURCE_ITEM).cab" -ErrorAction stop | Out-Null
}
catch {
Log $_.Exception.Message
}
}
}
# Retrieve capabilities from source OS and target OS
$SOURCE_CAPABILITIES = Get-Content -Path $CAP_PATH
$CAPABILITIES = Get-WindowsCapability -Online
# Loop through source OS capabilities, and install if missing on target OS
ForEach ($SOURCE_ITEM in $SOURCE_CAPABILITIES) {
$INSTALLED = $false
ForEach ($ITEM in $CAPABILITIES) {
if ($ITEM.Name -eq $($SOURCE_ITEM)) {
if ($ITEM.State -eq "Installed") {
$INSTALLED = $true
break
}
}
}
# Add if not already installed
if (!($INSTALLED)) {
Log "Adding capability $SOURCE_ITEM"
try {
Add-WindowsCapability -Online -Name $SOURCE_ITEM -Source $LOCAL_REPO_PATH -ErrorAction stop | Out-Null
}
catch {
Log $_.Exception.Message
}
}
else {
Log "Capability $SOURCE_ITEM is already installed"
}
}
# Add LCU, this is required after adding FODs and languages
Log ("Adding LCU")
Add-WindowsPackage -Online -PackagePath $LCU_PATH -NoRestart
# Get packages, we'll use this for debugging and to see if we need to restart to install
$PACKAGES = Get-WindowsPackage -Online
ForEach ($ITEM in $PACKAGES) {
Log "Package $($ITEM.PackageName) is $($ITEM.PackageState)"
if ($ITEM.PackageState -eq "InstallPending") {
$PENDING = $true
}
}
}
}
# Remove local repository and state files
Remove-Item -Path $LANG_PATH -Force -ErrorAction ignore | Out-Null
Remove-Item -Path $CAP_PATH -Force -ErrorAction ignore | Out-Null
Remove-Item -Path $OSVERSION_PATH -Force -ErrorAction ignore | Out-Null
Remove-Item -Path $LOCAL_REPO_PATH -Force -Recurse -ErrorAction ignore | Out-Null
# Restarting the computer to let setup process to exit cleanly
if ($PENDING) {
Log ("Install pending packages exists, restarting in 10 seconds")
Start-Process -FilePath cmd -ArgumentList "/C shutdown /r /t 10 /f"
}
Log ("Exiting")