動的更新を使用して Windows インストール メディアを更新する

適用対象

  • Windows 10
  • Windows 11

このトピックでは、展開前に動的更新プログラム パッケージを取得して既存の** Windows イメージに適用する方法について説明し、このプロセスを自動化するために使用できる Windows PowerShell スクリプトを含む。

ボリューム ライセンス メディアは、ボリューム ライセンス サービス センター (VLSC) の Windows の各リリースと、Windows Update for Business、Windows Server Update Services (WSUS)、Visual Studio サブスクリプションなどの関連チャネルごとに利用できます。 動的更新プログラムを使用すると、以前にインストールされている可能性がある言語パックと オンデマンド機能 (FOD) を保持しながら、Windows デバイスに最新の機能更新プログラム パッケージが一元的なアップグレードの一部として含まれています。 また、動的更新プログラムを使用すると、インプレイス アップグレード プロセスの一環として個別の品質更新プログラムをインストールする必要もなくなっています。

動的更新

機能更新プログラムのインストールが開始されるたびに (メディアまたは Windows Update に接続されている環境から)、 動的 更新プログラムは最初の手順の 1 つになります。 Windows セットアップは、Microsoft エンドポイントに接続して動的更新プログラム パッケージをフェッチし、それらの更新プログラムをオペレーティング システムのインストール メディアに適用します。 更新プログラム パッケージには、次の種類の更新プログラムが含まれます。

  • セットアップで機能Setup.exe使用するバイナリまたは他のファイルに対する更新プログラム
  • Windows 回復環境で使用される "安全なオペレーティング システム" (SafeOS) の更新プログラム
  • 機能更新プログラムを完了するために必要なサービス スタックの更新プログラム (詳細については、「サービス スタック 更新プログラム」 を参照してください)
  • 最新の累積的な (品質) 更新プログラム
  • Dynamic Update 専用の製造元によって既に公開されている該当するドライバーの更新プログラム

動的更新プログラムは、言語パックを再オンデマンド機能して、言語パックとパッケージを保持します。

デバイスは、動的更新プログラムを取得するためにインターネットに接続できる必要があります。 一部の環境では、動的更新プログラムを取得するオプションではありません。 動的更新プログラム パッケージを取得し、デバイスでセットアップを開始する前にイメージに適用することで、メディア ベースの機能更新プログラムを実行できます。

動的更新パッケージの取得

動的更新プログラム パッケージは、Microsoft Update カタログから入手できます。 そのサイトで、右上の検索バーを使用して、特定のリリースの動的更新プログラム パッケージを検索します。 たとえば 、「1809 Dynamic Update x64」 と入力すると、次のような結果が返されます。

Title、Products、Classification、Last Updated、Version、および Size というラベルの列を持つテーブルと、さまざまな動的更新プログラムと関連付けられた KB 記事を示す 4 行。

さまざまな動的更新プログラム パッケージが 1 つの検索の結果に含められているとは思えないので、すべての更新プログラムを検索するには、さまざまなキーワードで検索する必要がある場合があります。 また、必要なファイルを特定するために、結果のさまざまな部分を確認する必要があります。 次の表は、 検索結果 で検索または検索する主要な項目を太字で示しています。 たとえば、関連する "Setup Dynamic Update" を見つけるには、検索結果の [タイトル] 列にあるリンクを選択して、ダウンロード**** の詳細な説明を確認する必要があります。

この動的更新プログラム パッケージを検索するには、ここで結果を検索または確認します。 タイトル 製品 説明 ([タイトル] リンク を選択 して[詳細] を 表示する)
安全な OS の動的更新 2019-08 Dynamic Update... Windows 10 Dynamic Update, Windows Safe OS Dynamic Update ComponentUpdate:
動的更新のセットアップ 2019-08 Dynamic Update... Windows 10 動的更新プログラム SetupUpdate
最新の累積的な更新プログラム 2019-08 Windows 10 の累積的な更新プログラム Windows 10 Windows..の問題を解決するには、この更新プログラムをインストールします。
サービス スタックの動的更新 2019-09 Windows 10 のサービス スタック更新プログラム Windows 10... Windows..の問題を解決するには、この更新プログラムをインストールします。

追加の言語または言語を使用してイメージをカスタマイズするオンデマンド機能、ボリューム ライセンス サービス センターから補足メディア ISO ファイル をダウンロードします。 たとえば、デバイスに対して動的更新プログラムが無効になっているので、ユーザーが特定の設定を必要とするオンデマンド機能、これらをイメージにプレインストールできます。

Windows インストール メディアの更新

インストール メディアを適切に更新するには、複数の異なるターゲット (イメージ ファイル) で動作する多数のアクションが必要です。 一部のアクションは、異なるターゲットで繰り返されます。 ターゲット イメージ ファイルには、次のものが含まれます。

  • Windows プレインストール環境 (WinPE): Windows オペレーティング システムのインストール、展開、および修復に使用される小さなオペレーティング システム
  • Windows 回復環境 (WinRE): 起動できないオペレーティング システムの一般的な原因を修復します。 WinRE は WinPE に基づいており、追加のドライバー、言語、オプション パッケージ、その他のトラブルシューティングや診断ツールを使用してカスタマイズできます。
  • Windows オペレーティング システム: \sources\install.wim に格納されている 1 つ以上のエディションの Windows
  • Windows インストール メディア: Windows インストール メディア内のファイルとフォルダーの完全なコレクション。 たとえば、\sources フォルダー、\boot フォルダー、Setup.exeなどです。

次の表に、さまざまなタスクをファイルに適用する適切な順序を示します。 たとえば、完全なシーケンスは、サービス スタック更新プログラムを WinRE (1) に追加し、新しいメディア (26) に動的更新プログラムを追加することで終了します。

タスク WinRE (winre.wim) WinPE (boot.wim) オペレーティング システム (install.wim) 新しいメディア
サービス スタック動的更新プログラムの追加 1 9 18
言語パックの追加 2 10 19
ローカライズされたオプション パッケージの追加 3 11
フォントのサポートを追加する 4 12
音声合成の追加 5 13
更新Lang.ini 14
追加オンデマンド機能 20
安全な OS 動的更新プログラムの追加 6
セットアップ動的更新プログラムの追加 26
最新の累積的な更新プログラムを追加する 15 21
イメージをクリーンアップする 7 16 22
オプション コンポーネントの追加 23
.NET および .NET の累積的な更新プログラムを追加する 24
画像のエクスポート 8 17 25

注意

2021 年 2 月から、最新の累積的な更新プログラムとサービス スタック更新プログラムが組み合わされ、新しい累積的な更新プログラムとして Microsoft Update カタログに配布されます。 インストール メディアを更新するためにサービス スタック更新プログラムを必要とする手順 1、9、および 18 の場合は、結合された累積的な更新プログラムを使用する必要があります。 結合された累積的な更新プログラムの詳細については、「 サービス スタック更新プログラム」を参照してください

注意

Microsoft は、Kb4577586 から KB4577586 Windows「Adobe Flash Player の削除のための更新プログラム」から Flash コンポーネントを削除します。 手順 20 ~ 21 の間に KB4577586 (カタログで利用可能) で更新プログラムを展開することで、Flash をいつでも削除できます。 KB4577586 は、2021 年 7 月現在、Windows 10 バージョン 1607 および 1507 の最新の累積的な更新プログラムに含まれます。 この更新プログラムは、月次ロールアップおよびセキュリティ専用更新プログラム (Windows 8.1、Windows Server 2012、および Windows 8 Standard にも含まれます。 詳細については 、「Update on Adobe Flash Player End of Support」を参照してください

複数Windowsエディション

メイン オペレーティング システム ファイル (install.wim) には、複数のエディションのWindows。 インデックスに基づいて展開するには、特定のエディションの更新プログラムだけが必要になる可能性があります。 または、すべてのエディションで更新プログラムが必要な場合があります。 さらに、インストール前に言語がインストールされていることをオンデマンド機能、最新の累積的な更新プログラムが常に最後に適用されます。

その他の言語と機能

更新プログラムを実行するために、イメージに言語と機能を追加する必要はもう少なく、開始イメージの言語、省略可能なコンポーネント、および オンデマンド機能 を超えてイメージをカスタマイズする機会です。 これを行うには、サービス スタックの更新プログラムを適用し、次に言語の追加、機能の追加、最後に最新の累積的な更新プログラムを適用します。正しい順序でこれらの変更を行う必要があります。 提供されているサンプル スクリプトは、第 2 言語 (この場合は日本語 (ja-JP)) をインストールします。 この言語は言語によってサポートlp.cab、Language Experience Pack を追加する必要はありません。 日本語は、メイン オペレーティング システムと回復環境の両方に追加され、ユーザーは日本語で回復画面を表示できます。 これには、回復イメージに現在インストールされているパッケージのローカライズされたバージョンの追加が含まれます。

オプションのコンポーネントは、.NET 機能と共にオフラインでインストールすることもできますが、これにより、デバイスの再起動を必要とする保留中の操作が作成されます。 その結果、イメージのクリーンアップを実行する呼び出しは失敗します。 これを回避するには、2 つのオプションがあります。 1 つのオプションは、イメージのクリーンアップ 手順をスキップする方法ですが、その場合は install.wim が大きくなります。 もう 1 つのオプションは、クリーンアップ後、エクスポート前の手順で .NET コンポーネントとオプション コンポーネントをインストールする方法です。 これは、サンプル スクリプトのオプションです。 これにより、次回 (たとえば、次の月) にイメージを維持または更新するときに、元の install.wim (保留中のアクションなし) から開始する必要があります。

Windows PowerShellイメージに動的更新プログラムを適用するためのスクリプトを作成する

これらの例は、説明のみを使用するため、エラー処理が不足しています。 スクリプトでは、次のパッケージがローカルにこのフォルダー構造に格納されている必要があります。

フォルダー 説明
C:\mediaRefresh PowerShell スクリプトを含む親フォルダー
C:\mediaRefresh\oldMedia 更新される元のメディアを含むフォルダー。 たとえば、次のフォルダーSetup.exe\sources フォルダーが含まれているとします。
C:\mediaRefresh\newMedia 更新されたメディアを含むフォルダー。 \oldMedia からコピーされ、すべての更新およびクリーンアップ操作のターゲットとして使用されます。

作業の開始

スクリプトは、グローバル変数を宣言し、イメージのマウントに使用するフォルダーを作成することで始まります。 次に、\oldMedia から \newMedia まで、元のメディアのコピーを作成し、スクリプト エラーが発生した場合に備え、既知の状態から最初から開始する必要がある場合に備え、元のメディアを保持します。 また、変更を評価するための古いメディアと新しいメディアの比較も提供します。 新しいメディアが更新されるのを確認するには、メディアが読み取り専用で表示されないか確認します。

#Requires -RunAsAdministrator

function Get-TS { return "{0:HH:mm:ss}" -f [DateTime]::Now }

Write-Output "$(Get-TS): Starting media refresh"

# Declare language for showcasing adding optional localized components
$LANG  = "ja-jp"
$LANG_FONT_CAPABILITY = "jpan"

# Declare media for FOD and LPs
$FOD_ISO_PATH    = "C:\mediaRefresh\packages\FOD-PACKAGES_OEM_PT1_amd64fre_MULTI.iso"
$LP_ISO_PATH     = "C:\mediaRefresh\packages\CLIENTLANGPACKDVD_OEM_MULTI.iso"

# Declare Dynamic Update packages
$LCU_PATH        = "C:\mediaRefresh\packages\LCU.msu"
$SSU_PATH        = "C:\mediaRefresh\packages\SSU_DU.msu"
$SETUP_DU_PATH   = "C:\mediaRefresh\packages\Setup_DU.cab"
$SAFE_OS_DU_PATH = "C:\mediaRefresh\packages\SafeOS_DU.cab"
$DOTNET_CU_PATH  = "C:\mediaRefresh\packages\DotNet_CU.msu"

# Declare folders for mounted images and temp files
$MEDIA_OLD_PATH  = "C:\mediaRefresh\oldMedia"
$MEDIA_NEW_PATH  = "C:\mediaRefresh\newMedia"
$WORKING_PATH    = "C:\mediaRefresh\temp"
$MAIN_OS_MOUNT   = "C:\mediaRefresh\temp\MainOSMount"
$WINRE_MOUNT     = "C:\mediaRefresh\temp\WinREMount"
$WINPE_MOUNT     = "C:\mediaRefresh\temp\WinPEMount"

# Mount the language pack ISO
Write-Output "$(Get-TS): Mounting LP ISO"
$LP_ISO_DRIVE_LETTER = (Mount-DiskImage -ImagePath $LP_ISO_PATH -ErrorAction stop | Get-Volume).DriveLetter

# Declare language related cabs
$WINPE_OC_PATH              = "$LP_ISO_DRIVE_LETTER`:\Windows Preinstallation Environment\x64\WinPE_OCs"
$WINPE_OC_LANG_PATH         = "$WINPE_OC_PATH\$LANG"
$WINPE_OC_LANG_CABS         = Get-ChildItem $WINPE_OC_LANG_PATH -Name
$WINPE_OC_LP_PATH           = "$WINPE_OC_LANG_PATH\lp.cab"
$WINPE_FONT_SUPPORT_PATH    = "$WINPE_OC_PATH\WinPE-FontSupport-$LANG.cab"
$WINPE_SPEECH_TTS_PATH      = "$WINPE_OC_PATH\WinPE-Speech-TTS.cab"
$WINPE_SPEECH_TTS_LANG_PATH = "$WINPE_OC_PATH\WinPE-Speech-TTS-$LANG.cab"
$OS_LP_PATH                 = "$LP_ISO_DRIVE_LETTER`:\x64\langpacks\Microsoft-Windows-Client-Language-Pack_x64_$LANG.cab"

# Mount the Features on Demand ISO
Write-Output "$(Get-TS): Mounting FOD ISO"
$FOD_ISO_DRIVE_LETTER = (Mount-DiskImage -ImagePath $FOD_ISO_PATH -ErrorAction stop | Get-Volume).DriveLetter
$FOD_PATH = $FOD_ISO_DRIVE_LETTER + ":\"

# Create folders for mounting images and storing temporary files
New-Item -ItemType directory -Path $WORKING_PATH -ErrorAction Stop | Out-Null
New-Item -ItemType directory -Path $MAIN_OS_MOUNT -ErrorAction stop | Out-Null
New-Item -ItemType directory -Path $WINRE_MOUNT -ErrorAction stop | Out-Null
New-Item -ItemType directory -Path $WINPE_MOUNT -ErrorAction stop | Out-Null

# Keep the original media, make a copy of it for the new, updated media.
Write-Output "$(Get-TS): Copying original media to new media path"
Copy-Item -Path $MEDIA_OLD_PATH"\*" -Destination $MEDIA_NEW_PATH -Force -Recurse -ErrorAction stop | Out-Null
Get-ChildItem -Path $MEDIA_NEW_PATH -Recurse | Where-Object { -not $_.PSIsContainer -and $_.IsReadOnly } | ForEach-Object { $_.IsReadOnly = $false }

WinRE の更新

このスクリプトでは、Index = 1 (Windows 10 Education Edition) で示される 1 つのエディションだけが更新Windows 10 Educationされます。 次に、スクリプトによってイメージがマウントされ、Winre.wim が作業フォルダーに保存され、マウントされます。 その後、サービス スタックの動的更新を適用します。そのコンポーネントは他のコンポーネントの更新に使用されます。 スクリプトはオプションで日本語を追加しますので、言語パックをイメージに追加し、Winre.wim に既にインストールされているすべてのオプション パッケージの日本語バージョンをインストールします。 次に、OS Dynamic Update セーフを適用します。

画像のサイズを小さくするために、画像のクリーニングとエクスポートを行います。

# Mount the main operating system, used throughout the script
Write-Output "$(Get-TS): Mounting main OS"
Mount-WindowsImage -ImagePath $MEDIA_NEW_PATH"\sources\install.wim" -Index 1 -Path $MAIN_OS_MOUNT -ErrorAction stop| Out-Null  

#
# update Windows Recovery Environment (WinRE)
#
Copy-Item -Path $MAIN_OS_MOUNT"\windows\system32\recovery\winre.wim" -Destination $WORKING_PATH"\winre.wim" -Force -Recurse -ErrorAction stop | Out-Null
Write-Output "$(Get-TS): Mounting WinRE"
Mount-WindowsImage -ImagePath $WORKING_PATH"\winre.wim" -Index 1 -Path $WINRE_MOUNT -ErrorAction stop | Out-Null

# Add servicing stack update

# Note: If you are using a combined cumulative update, there may be a prerequisite servicing stack update required
# This is where you'd add the prerequisite SSU, before applying the latest combined cumulative update. 

# Note: If you are applying a combined cumulative update to a previously updated image (e.g. an image you updated last month)
# There is a known issue where the servicing stack update is installed, but the cumulative update will fail.
# This error should be caught and ignored, as the last step will be to apply the cumulative update 
# (or in this case the combined cumulative update) and thus the image will be left with the correct packages installed.

Write-Output "$(Get-TS): Adding package $SSU_PATH"

try
{
    Add-WindowsPackage -Path $WINRE_MOUNT -PackagePath $SSU_PATH | Out-Null  
}
Catch
{
    $theError = $_
    Write-Output "$(Get-TS): $theError"
    
    if ($theError.Exception -like "*0x8007007e*") {
        Write-Output "$(Get-TS): This failure is a known issue with combined cumulative update, we can ignore."
    }
    else {
        throw
    }
}

#
# Optional: Add the language to recovery environment
#
# Install lp.cab cab
Write-Output "$(Get-TS): Adding package $WINPE_OC_LP_PATH"
Add-WindowsPackage -Path $WINRE_MOUNT -PackagePath $WINPE_OC_LP_PATH -ErrorAction stop | Out-Null  

# Install language cabs for each optional package installed
$WINRE_INSTALLED_OC = Get-WindowsPackage -Path $WINRE_MOUNT
Foreach ($PACKAGE in $WINRE_INSTALLED_OC) {

    if ( ($PACKAGE.PackageState -eq "Installed") `
            -and ($PACKAGE.PackageName.startsWith("WinPE-")) `
            -and ($PACKAGE.ReleaseType -eq "FeaturePack") ) {

        $INDEX = $PACKAGE.PackageName.IndexOf("-Package")
        if ($INDEX -ge 0) {
            $OC_CAB = $PACKAGE.PackageName.Substring(0, $INDEX) + "_" + $LANG + ".cab"
            if ($WINPE_OC_LANG_CABS.Contains($OC_CAB)) {
                $OC_CAB_PATH = Join-Path $WINPE_OC_LANG_PATH $OC_CAB
                Write-Output "$(Get-TS): Adding package $OC_CAB_PATH"
                Add-WindowsPackage -Path $WINRE_MOUNT -PackagePath $OC_CAB_PATH -ErrorAction stop | Out-Null  
            }
        }
    }
}

# Add font support for the new language
if ( (Test-Path -Path $WINPE_FONT_SUPPORT_PATH) ) {
    Write-Output "$(Get-TS): Adding package $WINPE_FONT_SUPPORT_PATH"
    Add-WindowsPackage -Path $WINRE_MOUNT -PackagePath $WINPE_FONT_SUPPORT_PATH -ErrorAction stop | Out-Null
}

# Add TTS support for the new language
if (Test-Path -Path $WINPE_SPEECH_TTS_PATH) {
    if ( (Test-Path -Path $WINPE_SPEECH_TTS_LANG_PATH) ) {

        Write-Output "$(Get-TS): Adding package $WINPE_SPEECH_TTS_PATH"
        Add-WindowsPackage -Path $WINRE_MOUNT -PackagePath $WINPE_SPEECH_TTS_PATH -ErrorAction stop | Out-Null

        Write-Output "$(Get-TS): Adding package $WINPE_SPEECH_TTS_LANG_PATH"
        Add-WindowsPackage -Path $WINRE_MOUNT -PackagePath $WINPE_SPEECH_TTS_LANG_PATH -ErrorAction stop | Out-Null
    }
}

# Add Safe OS
Write-Output "$(Get-TS): Adding package $SAFE_OS_DU_PATH"
Add-WindowsPackage -Path $WINRE_MOUNT -PackagePath $SAFE_OS_DU_PATH -ErrorAction stop | Out-Null

# Perform image cleanup
Write-Output "$(Get-TS): Performing image cleanup on WinRE"
DISM /image:$WINRE_MOUNT /cleanup-image /StartComponentCleanup | Out-Null

# Dismount
Dismount-WindowsImage -Path $WINRE_MOUNT  -Save -ErrorAction stop | Out-Null

# Export
Write-Output "$(Get-TS): Exporting image to $WORKING_PATH\winre2.wim"
Export-WindowsImage -SourceImagePath $WORKING_PATH"\winre.wim" -SourceIndex 1 -DestinationImagePath $WORKING_PATH"\winre2.wim" -ErrorAction stop | Out-Null
Move-Item -Path $WORKING_PATH"\winre2.wim" -Destination $WORKING_PATH"\winre.wim" -Force -ErrorAction stop | Out-Null

WinPE の更新

このスクリプトは WinRE を更新するスクリプトと似ていますが、代わりに Boot.wim をマウントし、最新の累積的な更新プログラムを最後に含むパッケージを適用し、保存します。 これは、Boot.wim 内のすべてのイメージ (通常は 2 つのイメージ) に対して繰り返されます。 最初に、サービス スタックの動的更新プログラムを適用します。 スクリプトは日本語でこのメディアをカスタマイズしていますので、言語パック ISO の WinPE フォルダーから言語パックをインストールします。 さらに、フォントのサポートとテキストを音声 (TTS) のサポートに追加します。 スクリプトは新しい言語を追加していますので、イメージにlang.ini言語を識別するために使用される言語を再構築します。 最後に、Boot.wim をクリーンアップしてエクスポートし、新しいメディアにコピーします。

#
# update Windows Preinstallation Environment (WinPE)
#

# Get the list of images contained within WinPE
$WINPE_IMAGES = Get-WindowsImage -ImagePath $MEDIA_NEW_PATH"\sources\boot.wim"

Foreach ($IMAGE in $WINPE_IMAGES) {

    # update WinPE
    Write-Output "$(Get-TS): Mounting WinPE"
    Mount-WindowsImage -ImagePath $MEDIA_NEW_PATH"\sources\boot.wim" -Index $IMAGE.ImageIndex -Path $WINPE_MOUNT -ErrorAction stop | Out-Null  

    # Add SSU

    # Note: If you are using a combined cumulative update, there may be a prerequisite servicing stack update required
    # This is where you'd add the prerequisite SSU, before applying the latest combined cumulative update. 

    # Note: If you are applying a combined cumulative update to a previously updated image (e.g. an image you updated last month)
    # There is a known issue where the servicing stack update is installed, but the cumulative update will fail.
    # This error should be caught and ignored, as the last step will be to apply the cumulative update 
    # (or in this case the combined cumulative update) and thus the image will be left with the correct packages installed.

    Write-Output "$(Get-TS): Adding package $SSU_PATH"
    
    try
    {
        Add-WindowsPackage -Path $WINPE_MOUNT -PackagePath $SSU_PATH | Out-Null
    }
    Catch
    {
        $theError = $_
        Write-Output "$(Get-TS): $theError"
        
        if ($theError.Exception -like "*0x8007007e*") {
            Write-Output "$(Get-TS): This failure is a known issue with combined cumulative update, we can ignore."
        }
        else {
            throw
        }
    }

    # Install lp.cab cab
    Write-Output "$(Get-TS): Adding package $WINPE_OC_LP_PATH"
    Add-WindowsPackage -Path $WINPE_MOUNT -PackagePath $WINPE_OC_LP_PATH -ErrorAction stop | Out-Null  

    # Install language cabs for each optional package installed
    $WINPE_INSTALLED_OC = Get-WindowsPackage -Path $WINPE_MOUNT
    Foreach ($PACKAGE in $WINPE_INSTALLED_OC) {

        if ( ($PACKAGE.PackageState -eq "Installed") `
                -and ($PACKAGE.PackageName.startsWith("WinPE-")) `
                -and ($PACKAGE.ReleaseType -eq "FeaturePack") ) {

            $INDEX = $PACKAGE.PackageName.IndexOf("-Package")
            if ($INDEX -ge 0) {

                $OC_CAB = $PACKAGE.PackageName.Substring(0, $INDEX) + "_" + $LANG + ".cab"
                if ($WINPE_OC_LANG_CABS.Contains($OC_CAB)) {
                    $OC_CAB_PATH = Join-Path $WINPE_OC_LANG_PATH $OC_CAB
                    Write-Output "$(Get-TS): Adding package $OC_CAB_PATH"
                    Add-WindowsPackage -Path $WINPE_MOUNT -PackagePath $OC_CAB_PATH -ErrorAction stop | Out-Null  
                }
            }
        }
    }

    # Add font support for the new language
    if ( (Test-Path -Path $WINPE_FONT_SUPPORT_PATH) ) {
        Write-Output "$(Get-TS): Adding package $WINPE_FONT_SUPPORT_PATH"
        Add-WindowsPackage -Path $WINPE_MOUNT -PackagePath $WINPE_FONT_SUPPORT_PATH -ErrorAction stop | Out-Null
    }

    # Add TTS support for the new language
    if (Test-Path -Path $WINPE_SPEECH_TTS_PATH) {
        if ( (Test-Path -Path $WINPE_SPEECH_TTS_LANG_PATH) ) {

            Write-Output "$(Get-TS): Adding package $WINPE_SPEECH_TTS_PATH"
            Add-WindowsPackage -Path $WINPE_MOUNT -PackagePath $WINPE_SPEECH_TTS_PATH -ErrorAction stop | Out-Null

            Write-Output "$(Get-TS): Adding package $WINPE_SPEECH_TTS_LANG_PATH"
            Add-WindowsPackage -Path $WINPE_MOUNT -PackagePath $WINPE_SPEECH_TTS_LANG_PATH -ErrorAction stop | Out-Null
        }
    }

    # Generates a new Lang.ini file which is used to define the language packs inside the image
    if ( (Test-Path -Path $WINPE_MOUNT"\sources\lang.ini") ) {
        Write-Output "$(Get-TS): Updating lang.ini"
        DISM /image:$WINPE_MOUNT /Gen-LangINI /distribution:$WINPE_MOUNT | Out-Null
    }

    # Add latest cumulative update
    Write-Output "$(Get-TS): Adding package $LCU_PATH"
    Add-WindowsPackage -Path $WINPE_MOUNT -PackagePath $LCU_PATH -ErrorAction stop | Out-Null  

    # Perform image cleanup
    Write-Output "$(Get-TS): Performing image cleanup on WinPE"
    DISM /image:$WINPE_MOUNT /cleanup-image /StartComponentCleanup | Out-Null

    # Dismount
    Dismount-WindowsImage -Path $WINPE_MOUNT -Save -ErrorAction stop | Out-Null

    #Export WinPE
    Write-Output "$(Get-TS): Exporting image to $WORKING_PATH\boot2.wim"
    Export-WindowsImage -SourceImagePath $MEDIA_NEW_PATH"\sources\boot.wim" -SourceIndex $IMAGE.ImageIndex -DestinationImagePath $WORKING_PATH"\boot2.wim" -ErrorAction stop | Out-Null

}

Move-Item -Path $WORKING_PATH"\boot2.wim" -Destination $MEDIA_NEW_PATH"\sources\boot.wim" -Force -ErrorAction stop | Out-Null

メイン オペレーティング システムを更新する

この次のフェーズでは、前のスクリプトで既にマウントされたメイン オペレーティング システムをマウントする必要はありません。 このスクリプトは、サービス スタックの動的更新プログラムを適用することで開始します。 次に、日本語サポートを追加し、次に日本語機能を追加します。 動的更新パッケージとは異なり、これらの機能を Add-WindowsCapability 追加するために利用されます。 このような機能の完全な一覧と、関連する機能名については、「Available オンデマンド機能」 を参照してください

ここで、他のオプション コンポーネントを有効にするか、他のコンポーネントを追加オンデマンド機能。 このような機能に関連付けられた累積的な更新プログラム (.NET など) がある場合は、これらの更新プログラムを適用します。 スクリプトは、最新の累積的な更新プログラムの適用を続行します。 最後に、スクリプトはイメージをクリーンアップしてエクスポートします。

オプション コンポーネントは、.NET 機能と共にオフラインでインストールできますが、デバイスを再起動する必要があります。 スクリプトがクリーンアップ後およびエクスポート前に .NET コンポーネントとオプション コンポーネントをインストールする理由は、この理由です。

#
# update Main OS
#

# Add servicing stack update
Write-Output "$(Get-TS): Adding package $SSU_PATH"
Add-WindowsPackage -Path $MAIN_OS_MOUNT -PackagePath $SSU_PATH -ErrorAction stop | Out-Null

# Optional: Add language to main OS
Write-Output "$(Get-TS): Adding package $OS_LP_PATH"
Add-WindowsPackage -Path $MAIN_OS_MOUNT -PackagePath $OS_LP_PATH -ErrorAction stop | Out-Null  

# Optional: Add a Features on Demand to the image
Write-Output "$(Get-TS): Adding language FOD: Language.Fonts.Jpan~~~und-JPAN~0.0.1.0"
Add-WindowsCapability -Name "Language.Fonts.$LANG_FONT_CAPABILITY~~~und-$LANG_FONT_CAPABILITY~0.0.1.0" -Path $MAIN_OS_MOUNT -Source $FOD_PATH -ErrorAction stop | Out-Null

Write-Output "$(Get-TS): Adding language FOD: Language.Basic~~~$LANG~0.0.1.0"
Add-WindowsCapability -Name "Language.Basic~~~$LANG~0.0.1.0" -Path $MAIN_OS_MOUNT -Source $FOD_PATH -ErrorAction stop | Out-Null

Write-Output "$(Get-TS): Adding language FOD: Language.OCR~~~$LANG~0.0.1.0"
Add-WindowsCapability -Name "Language.OCR~~~$LANG~0.0.1.0" -Path $MAIN_OS_MOUNT -Source $FOD_PATH -ErrorAction stop | Out-Null

Write-Output "$(Get-TS): Adding language FOD: Language.Handwriting~~~$LANG~0.0.1.0"
Add-WindowsCapability -Name "Language.Handwriting~~~$LANG~0.0.1.0" -Path $MAIN_OS_MOUNT -Source $FOD_PATH -ErrorAction stop | Out-Null

Write-Output "$(Get-TS): Adding language FOD: Language.TextToSpeech~~~$LANG~0.0.1.0"
Add-WindowsCapability -Name "Language.TextToSpeech~~~$LANG~0.0.1.0" -Path $MAIN_OS_MOUNT -Source $FOD_PATH -ErrorAction stop | Out-Null

Write-Output "$(Get-TS): Adding language FOD:Language.Speech~~~$LANG~0.0.1.0"
Add-WindowsCapability -Name "Language.Speech~~~$LANG~0.0.1.0" -Path $MAIN_OS_MOUNT -Source $FOD_PATH -ErrorAction stop | Out-Null

# Note: If I wanted to enable additional Features on Demand, I'd add these here.

# Add latest cumulative update
Write-Output "$(Get-TS): Adding package $LCU_PATH"
Add-WindowsPackage -Path $MAIN_OS_MOUNT -PackagePath $LCU_PATH -ErrorAction stop | Out-Null

# Copy our updated recovery image from earlier into the main OS
# Note: If I were updating more than 1 edition, I'd want to copy the same recovery image file
# into each edition to enable single instancing
Copy-Item -Path $WORKING_PATH"\winre.wim" -Destination $MAIN_OS_MOUNT"\windows\system32\recovery\winre.wim" -Force -Recurse -ErrorAction stop | Out-Null

# Perform image cleanup
Write-Output "$(Get-TS): Performing image cleanup on main OS"
DISM /image:$MAIN_OS_MOUNT /cleanup-image /StartComponentCleanup | Out-Null

#
# Note: If I wanted to enable additional Optional Components, I'd add these here.
# In addition, we'll add .NET 3.5 here as well. Both .NET and Optional Components might require
# the image to be booted, and thus if we tried to cleanup after installation, it would fail.
#

Write-Output "$(Get-TS): Adding NetFX3~~~~"
Add-WindowsCapability -Name "NetFX3~~~~" -Path $MAIN_OS_MOUNT -Source $FOD_PATH -ErrorAction stop | Out-Null

# Add .NET Cumulative Update
Write-Output "$(Get-TS): Adding package $DOTNET_CU_PATH"
Add-WindowsPackage -Path $MAIN_OS_MOUNT -PackagePath $DOTNET_CU_PATH -ErrorAction stop | Out-Null

# Dismount
Dismount-WindowsImage -Path $MAIN_OS_MOUNT -Save -ErrorAction stop | Out-Null

# Export
Write-Output "$(Get-TS): Exporting image to $WORKING_PATH\install2.wim"
Export-WindowsImage -SourceImagePath $MEDIA_NEW_PATH"\sources\install.wim" -SourceIndex 1 -DestinationImagePath $WORKING_PATH"\install2.wim" -ErrorAction stop | Out-Null
Move-Item -Path $WORKING_PATH"\install2.wim" -Destination $MEDIA_NEW_PATH"\sources\install.wim" -Force -ErrorAction stop | Out-Null

残りのメディア ファイルを更新する

スクリプトのこの部分は、セットアップ ファイルを更新します。 セットアップ動的更新パッケージ内の個々のファイルを新しいメディアにコピーします。 この手順では、必要に応じて更新Setup.exe、最新の互換性データベース、および置換コンポーネント マニフェストが表示されます。

#
# update remaining files on media
#

# Add Setup DU by copy the files from the package into the newMedia
Write-Output "$(Get-TS): Adding package $SETUP_DU_PATH"
cmd.exe /c $env:SystemRoot\System32\expand.exe $SETUP_DU_PATH -F:* $MEDIA_NEW_PATH"\sources" | Out-Null

完了する

最後の手順として、スクリプトは一時ファイルの作業フォルダーを削除し、言語パックと ISOs のオンデマンド機能します。

#
# Perform final cleanup
#

# Remove our working folder
Remove-Item -Path $WORKING_PATH -Recurse -Force -ErrorAction stop | Out-Null

# Dismount ISO images
Write-Output "$(Get-TS): Dismounting ISO images"
Dismount-DiskImage -ImagePath $LP_ISO_PATH -ErrorAction stop | Out-Null
Dismount-DiskImage -ImagePath $FOD_ISO_PATH -ErrorAction stop | Out-Null

Write-Output "$(Get-TS): Media refresh completed!"