之前的文章:建立可開機的 Windows Server 2016 安裝 USB
,我們看了如何建立可開機的 USB。
而我自己在安裝 Windows Server 2016 過程中,卻是一開機就愣住:太久沒重灌忘了我的筆電預設使用 UEFI (UEFI 介紹可以看 這裡 跟 這裡),雖然透過調整開機設定還是能正常安裝,但想到下次可能仍然會忘記,所以紀錄一下供日後查閱.
diskpart
使用的方式與前一篇 建立可開機的 Windows Server 2016 安裝 USB
大致相同,只是在針對 UEFI 設定會有些不同
MVP-Weithenn 寫的很詳細,就請大家直接參閱專家的文章- 製作用於 UEFI 的 Bootable USB
PowerShell
看過百敬老師的 PowerShell 介紹,不由得讚嘆其強大跟便利,雖然讓人躍躍欲試,但機會實在不多,剛好看到有國外高手用 PowerShell 寫的 How to create UEFI bootable USB media to install Windows Server 2016 覺得有些改善的空間,就來動手修改囉。
PowerShell
來建立開機USB國手高手的文章 - How to create UEFI bootable USB media to install Windows Server 2016,因為沒有指定 USB ,有可能造成連結到電腦的多個 USB 資料都被清除,我調整的寫法就是針對這個問題
檔案在這 GITHUB,下面是程式碼說明
# 指定 Windows Server 2016 的 ISO 檔路徑
$iso = 'C:\ct_windows_server_2016_x64_dvd_9327748.iso'
# 指定 USB 的磁碟代碼
$usbdiskletter = 'F'
# 取得 USB 的磁碟資訊
$usb =Get-Partition| where DriveLetter -eq "$usbdiskletter"|Get-Disk
# 清除 USB 資料
$usb| Clear-Disk -RemoveData -Confirm:$true -PassThru
# 將 USB 設定為 `GPT`
if ($usb.PartitionStyle -eq 'RAW') {
$usb | Initialize-Disk -PartitionStyle GPT
} else {
$usb | Set-Disk -PartitionStyle GPT
}
# 建立主要分割並格式化成 `FAT32`
$volume = $usb | New-Partition -UseMaximumSize -AssignDriveLetter | Format-Volume -FileSystem FAT32
# 檢查 USB 是否已連結
if (Test-Path -Path "$($volume.DriveLetter):\") {
# 掛載 Windows Server 2016 ISO
$miso = Mount-DiskImage -ImagePath $iso -StorageType ISO -PassThru
# 取得 Windows Server 2016 虛擬光碟機代碼
$dl = ($miso | Get-Volume).DriveLetter
}
# 檢查 Windows Server 2016 虛擬光碟是否有 `install.wim`
if (Test-Path -Path "$($dl):\sources\install.wim") {
# 複製除 install.wim 外的 Windows Server 2016 虛擬光碟 內容到 USB
& (Get-Command "$($env:systemroot)\system32\robocopy.exe") @(
"$($dl):\",
"$($volume.DriveLetter):\"
,'/S','/R:0','/Z','/XF','install.wim','/NP'
)
# 分割 install.wim
& (Get-Command "$($env:systemroot)\system32\dism.exe") @(
'/split-image',
"/imagefile:$($dl):\sources\install.wim",
"/SWMFile:$($volume.DriveLetter):\sources\install.swm",
'/FileSize:4096'
)
}
# 退出 USB
(New-Object -comObject Shell.Application).NameSpace(17).
ParseName("$($volume.DriveLetter):").InvokeVerb('Eject')
# 卸載 Windows Server 2016 ISO
Dismount-DiskImage -ImagePath $iso