Bar

PowerShell Windows 10のインストール ディスク(ISO)を作成する方法

Windows 10のインストール ディスクを作成する方法は多くのユーザーさんがブログ等で説明されています。
説明されているスクリプトを実行すればWindows 10のインストールディスク(ISO)ファイルが作成されます。
全く問題はありませんが、スクリプトの各行が何を行っているのかが理解できていなかったので調べた内容をメモ。
本記事はMicrosoft MVPの知人が管理しているブログ「MURA's HomePage」、「悩み多き文教市場のインフラ屋さん」の記事をベースにしています。いつもありがとうございます!!

2015.11.02 加筆
スクリプトに「実行ファイルの存在チェック」機能を追加しました

2015.11.08 加筆
Build 10586のISO ファイルが作成できる事を確認しました。
以前の作業フォルダを削除するプロンプトを追加しました。

2016.04.27 追記
Build 14332のISO ファイルが作成できる事を確認しました。

事前作業

Windows 10のインストール ディスクを作成する前に
Windows ADK for Windows 10(Windows アセスメント & デプロイメント キット)
をダウンロードし、
  • Deployment Tools
  • Windows Preinstallation Environment(Windows PE)
の機能をインストールしてください。
ISOファイル作成に使います。

Windows 10のインストール ディスクを作成する方法

今回インストール ディスクを作成するOSはWindows 10 Pro 64bit(Build 10576)を使用し、64bit(x64)のインストール ディスクを作成します。
※環境によってスクリプトを適時変更してください。

スクリプトはPowerShell コマンドレットを使用しますが、一部はコマンドレットが未対応なためDism コマンドを使います。
スクリプト
#変数
$buildNumber = "10576"
$installEsd = 'C:\$WINDOWS.~BT\Sources\Install.esd'
$temp = "C:\WinImg"
$tempEsd = "$temp\esd"
$empty = "$temp\tmp"
$captureName = "tmp"
$installWim = "$tempEsd\sources\Install.wim"
$bootWim = "$tempEsd\sources\boot.wim"
$iso = "$temp\ISO"
$isoFile = "$iso\Windows10_Build$buildNumber.iso"
$oscdimgPath = "C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Deployment Tools\amd64\Oscdimg"

#ファイル存在チェック
if((Test-Path -Path $installEsd) -eq $false){
    Write-Host "Install.esdファイルがありません。`n処理を停止します" -ForegroundColor Cyan
    break
}

#作業フォルダー
if((Test-Path -Path $tempEsd) -eq $true -or (Test-Path -Path $empty) -eq $true){
    #前回のフォルダーを確認、削除
    $ret = Read-Host "前回の作業フォルダーを削除してもいいですか?[Y or N]"
    if($ret -eq "Y"){
        Remove-Item -Path $tempEsd -Recurse -Force -ErrorAction SilentlyContinue
        Remove-Item -Path $empty -Recurse -Force -ErrorAction SilentlyContinue
    }
    else{
        break
    }
}
else{
    #作業用フォルダを作成
    New-Item -Path $tempEsd -ItemType Directory -ErrorAction SilentlyContinue
    New-Item -Path $empty -ItemType Directory -ErrorAction SilentlyContinue
    New-Item -Path $iso -ItemType Directory -ErrorAction SilentlyContinue
}

#install.esdを展開
#Dism /Apply-Image /ImageFile:$installEsd /Index=1 /ApplyDir:$tempEsd
Expand-WindowsImage -ImagePath $installEsd -Index 1 -ApplyPath $tempEsd -ErrorAction Stop

#空のboot.wimを作成する
#Dism /Capture-Image /ImageFile:$bootWim /CaptureDir:$empty /Name:$captureName /Compress:max
New-WindowsImage -ImagePath $bootWim -CapturePath $empty -Name $captureName -CompressionType max

#boot.wimに対しinstall.esdのindex 2をエクスポートする
#Export-WindowsImageは-CompressionTypeにRecoveryがないため使用できません
Dism /Export-Image /SourceImageFile:$installEsd /SourceIndex:2 /DestinationImageFile:$bootWim /Compress:Recovery /Bootable

#boot.wimのIndex 1は不要なため削除
#Dism /Delete-Image /ImageFile:$bootWim /Index:1
Remove-WindowsImage -ImagePath $bootWim -Index 1 -CheckIntegrity

#Index 3をエクスポート
Dism /Export-Image /SourceImageFile:$installEsd /SourceIndex:3 /DestinationImageFile:$bootWim /Compress:Recovery /Bootable

#空のinstall.wimを作成
#Dism /Capture-Image /ImageFile:$installWim /CaptureDir:$empty /Name:$captureName /Compress:Maximum
New-WindowsImage -ImagePath $installWim -CapturePath $empty -Name $captureName -CompressionType max

#install.wimに対しinstall.esdのindex 4をエクスポートする
Dism /Export-Image /SourceImageFile:$installEsd /SourceIndex:4 /DestinationImageFile:$installWim /Compress:recovery

#install.wimのIndex 1は不要なため削除
#Dism /Delete-Image /ImageFile:$installWim /Index:1
Remove-WindowsImage -ImagePath $installWim -Index 1 -CheckIntegrity

#ファイル存在チェック
if((Test-Path -Path "$oscdimgPath\oscdimg.exe") -eq $false){
    Write-Host "Oscdimg.exeがありません。`n処理を停止します" -ForegroundColor Cyan
    break
}

#oscdimg.exeを使ってISOファイル生成
$oscdimgPath
$bootData = '2#p0,e,b{0}#pEF,e,b{1}' -f "$tempEsd\boot\etfsboot.com","$tempEsd\efi\Microsoft\boot\efisys.bin"
  
$Proc = Start-Process -FilePath "$oscdimgPath\oscdimg.exe" -ArgumentList @('-m -o -u2 -udfver102',"-bootdata:$BootData","$tempEsd","$isoFile") -PassThru -Wait -NoNewWindow
if($Proc.ExitCode -ne 0)
{
    Write-Host "ISO生成に失敗しました`nエラーコード: $($Proc.ExitCode)"
}
スクリプトの説明
まずは各種変数を指定、作業用フォルダを作成します。
#ビルド番号
$buildNumber = "10576"

#Install.esdファイルの保存場所
$installEsd = 'C:\$WINDOWS.~BT\Sources\Install.esd'

#install.esdファイルの展開先
$temp = "C:\WinImg"
$tempEsd = "$temp\esd"

#wimファイル生成時の一時フォルダ
$empty = "$temp\tmp"
$captureName = "tmp"

#install.wimおよびboot.wimファイルの変数
$installWim = "$tempEsd\sources\Install.wim"
$bootWim = "$tempEsd\sources\boot.wim"

#ISOファイル作成場所およびファイル名
$iso = "$temp\ISO"
$isoFile = "$iso\Windows10_Build$buildNumber.iso"

#ISOファイルを作成するOscdimg.exeの保存場所
$oscdimgPath = "C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Deployment Tools\amd64\Oscdimg"

#作業フォルダー
if((Test-Path -Path $tempEsd) -eq $true -or (Test-Path -Path $empty) -eq $true){
    #前回のフォルダーを確認、削除
    $ret = Read-Host "前回の作業フォルダーを削除してもいいですか?[Y or N]"
    if($ret -eq "Y"){
        Remove-Item -Path $tempEsd -Recurse -Force -ErrorAction SilentlyContinue
        Remove-Item -Path $empty -Recurse -Force -ErrorAction SilentlyContinue
    }
    else{
        break
    }
}
else{
    #作業用フォルダを作成
    New-Item -Path $tempEsd -ItemType Directory -ErrorAction SilentlyContinue
    New-Item -Path $empty -ItemType Directory -ErrorAction SilentlyContinue
    New-Item -Path $iso -ItemType Directory -ErrorAction SilentlyContinue
}

次に、C:\$WINDOWS.~BT\Sourcesに保存されているInstall.esdの情報を確認します。
確認すると4種類のデータが格納されており、各インデックスは下記用途に使います。
  • インデックス1
    install.esdファイルを展開するために使用
  • インデックス2,3
    boot.wimを作成するために使用
  • インデックス4
    install.wimを作成するために使用
※なお、Get-WindowsImage コマンドレットはWIM又はVHDファイル用なのでESDファイルの情報を見れません。
#install.esd:イメージ情報を確認
Dism /Get-WimInfo /WimFile:$installEsd
<#
実行結果
-----------------------
イメージの詳細: C:\$WINDOWS.~BT\Sources\Install.esd

インデックス: 1
名前: Windows Setup Media
説明: Windows Setup Media
サイズ: 260,275,791 バイト

インデックス: 2
名前: Microsoft Windows PE (x64)
説明: Microsoft Windows PE (x64)
サイズ: 1,605,925,472 バイト

インデックス: 3
名前: Microsoft Windows Setup (x64)
説明: Microsoft Windows Setup (x64)
サイズ: 1,760,506,321 バイト

インデックス: 4
名前: Windows 10 Pro Technical Preview
説明: Windows 10 Pro Technical Preview
サイズ: 14,094,894,695 バイト
#>

install.esdのインデックス1を展開します。
展開はDism /Apply-Image、又はExpand-WindowsImage コマンドレットを使います。
#イメージを展開
#Dism /Apply-Image /ImageFile:$installEsd /Index=1 /ApplyDir:$tempEsd
Expand-WindowsImage -ImagePath $installEsd -Index 1 -ApplyPath $tempEsd

展開先フォルダにWindows PE イメージ(Boot.wim)がない事を確認します。
確認はDism /Get-WimInfo、又はGet-WindowsImage コマンドレットを使います。
#boot.wimがない事を確認
#Dism /Get-WimInfo /WimFile:$bootWim
Get-WindowsImage -ImagePath $bootWim
<#
実行結果
-----------------------
エラー: 2
指定されたファイルが見つかりません。
#>

空のWindows PE イメージ ファイル(boot.wim)を作成します。
作成後、boot.wimの情報を確認すると何もないインデックス1が作成されます。
#空のboot.wimを作成する
#/Name:イメージの説明
#Dism /Capture-Image /ImageFile:$bootWim /CaptureDir:$empty /Name:$captureName /Compress:max
New-WindowsImage -ImagePath $bootWim -CapturePath $empty -Name $captureName -CompressionType max

#boot.wim:イメージの詳細を確認
#Dism /Get-WimInfo /WimFile:$bootWim
Get-WindowsImage -ImagePath $bootWim
<#
実行結果
-----------------------
イメージの詳細: c:\WinImg\esd\sources\boot.wim

インデックス: 1
名前: tmp
説明: <未定義>
サイズ: 0 バイト
#>

空のboot.wimに対しinstall.esdのindex 2,3をエクスポートします。
途中、boot.wimのインデックス 1は不要なため削除します。
Dism /Export-Imageに対応するPowerShell コマンドレットとしてExport-WindowsImageが用意されいますが、残念ながら-CompressionTypeパラメータにRecoveryがないため使用できません。
#boot.wimに対しinstall.esdのindex 2をエクスポートする
Dism /Export-Image /SourceImageFile:$installEsd /SourceIndex:2 /DestinationImageFile:$bootWim /Compress:Recovery /Bootable

#boot.wim:イメージの詳細を確認
#Dism /Get-WimInfo /WimFile:$bootWim
Get-WindowsImage -ImagePath $bootWim
<#
実行結果
-----------------------
イメージの詳細: c:\WinImg\esd\sources\boot.wim

インデックス: 1
名前: tmp
説明: <未定義>
サイズ: 0 バイト

インデックス: 2
名前: Microsoft Windows PE (x64)
説明: Microsoft Windows PE (x64)
サイズ: 1,605,925,472 バイト
#>

#boot.wimのIndex 1は不要なため削除
#Dism /Delete-Image /ImageFile:$bootWim /Index:1
Remove-WindowsImage -ImagePath $bootWim -Index 1 -CheckIntegrity

#boot.wim:イメージの詳細を確認
#Dism /Get-WimInfo /WimFile:$bootWim
Get-WindowsImage -ImagePath $bootWim
<#
実行結果
-----------------------
イメージの詳細: c:\WinImg\esd\sources\boot.wim

インデックス: 1
名前: Microsoft Windows PE (x64)
説明: Microsoft Windows PE (x64)
サイズ: 1,605,925,472 バイト
#>

#Index 3をエクスポート
Dism /Export-Image /SourceImageFile:$installEsd /SourceIndex:3 /DestinationImageFile:$bootWim /Compress:Recovery /Bootable

#boot.wim:イメージの詳細を確認
Dism /Get-WimInfo /WimFile:$bootWim
<#
実行結果
-----------------------
イメージの詳細: c:\WinImg\esd\sources\boot.wim

インデックス: 1
名前: Microsoft Windows PE (x64)
説明: Microsoft Windows PE (x64)
サイズ: 1,605,925,472 バイト

インデックス: 2
名前: Microsoft Windows Setup (x64)
説明: Microsoft Windows Setup (x64)
サイズ: 1,760,506,321 バイト
#>

boot.wimが作成できたので、次はinstall.wimを作成します。
boot.wim同様、最初に空のinstall.wimを作成します。
#空のinstall.wimがないためエラー
Dism /Get-WimInfo /WimFile:$installWim
<#
エラー: 2
指定されたファイルが見つかりません。
#>

#空のinstall.wimを作成
#Dism /Capture-Image /ImageFile:$installWim /CaptureDir:$empty /Name:$captureName /Compress:Maximum
New-WindowsImage -ImagePath $installWim -CapturePath $empty -Name $captureName -CompressionType max

#install.wim:イメージの詳細を確認
#Dism /Get-WimInfo /WimFile:$installWim
Get-WindowsImage -ImagePath $installWim
<#
実行結果
-----------------------
イメージの詳細: c:\WinImg\esd\sources\Install.wim

インデックス: 1
名前: tmp
説明: <未定義>
サイズ: 0 バイト
#>

install.wimに対しinstall.esdのindex 4をエクスポートし、不要なインデックスを削除します。
#install.wimに対しinstall.esdのindex 4をエクスポートする
Dism /Export-Image /SourceImageFile:$installEsd /SourceIndex:4 /DestinationImageFile:$installWim /Compress:recovery

#install.wim:イメージの詳細を確認
#Dism /Get-WimInfo /WimFile:$installWim
Get-WindowsImage -ImagePath $installWim
<#
イメージの詳細: c:\WinImg\esd\sources\Install.wim

インデックス: 1
名前: tmp
説明: <未定義>
サイズ: 0 バイト

インデックス: 2
名前: Windows 10 Pro Technical Preview
説明: Windows 10 Pro Technical Preview
サイズ: 14,094,894,695 バイト
#>

#install.wimのIndex 1は不要なため削除
#Dism /Delete-Image /ImageFile:$installWim /Index:1
Remove-WindowsImage -ImagePath $installWim -Index 1 -CheckIntegrity

#install.wim:イメージの詳細を確認
#Dism /Get-WimInfo /WimFile:$installWim
Get-WindowsImage -ImagePath $installWim
<#
実行結果
-----------------------
イメージの詳細: c:\WinImg\esd\sources\Install.wim

インデックス: 1
名前: Windows 10 Pro Technical Preview
説明: Windows 10 Pro Technical Preview
サイズ: 14,094,894,695 バイト
#>

最後にOscdimg.exeを使ってISOファイルを作成します。
#oscdimg.exeを使ってISOファイル生成
#format演算子を使い{0}に"$tempEsd\boot\etfsboot.com"、{1}は"$tempEsd\efi\Microsoft\boot\efisys.bin"を出力
$bootData = '2#p0,e,b{0}#pEF,e,b{1}' -f "$tempEsd\boot\etfsboot.com","$tempEsd\efi\Microsoft\boot\efisys.bin"

#oscdimg.exeの引数は全て-ArgumentList パラメータにカンマ区切りで指定
$oroc = Start-Process -FilePath "$oscdimgPath\oscdimg.exe" -ArgumentList @('-m -o -u2 -udfver102',"-bootdata:$BootData","$tempEsd","$isoFile") -PassThru -Wait -NoNewWindow
if($proc.ExitCode -ne 0)
{
    Write-Host "ISO生成に失敗しました`nエラーコード: $($Proc.ExitCode)"
}
oscdimg.exeの部分は下記のとおり実行されます。
C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Deployment Tools\amd64\Oscdimg\oscdimg.exe -m -o -u2 -udfver102 -bootdata:2#p0,e,bC:\WinImg\esd\boot\etfsboot.com#pEF,e,bC:\WinImg\esd\efi\Microsoft\boot\efisys.bin C:\WinImg\esd C:\WinImg\ISO\Windows10_Build10576.iso
余談:新しいビルドが出たら早めに作成したいですね
先日Windows 10 Build 10565をインストール後、何も考えずCleanmgr.exeを実行しました。
Cドライブの空き容量を確保するためでしたが、不要なファイルを削除した事でインストール ディスクを作成する事が出来なくなります。
Build番号によっては再インストール→Upgradeの悲しい道を歩むことになりえます、検証屋さんはCleanmgr.exeを実行する前にISOファイルを作成しましょうね。