Windows PEでバックアップ・リストア(3)
ではドライブ選択ダイアログを定義していきます。
# ============================================================
# 自作ドライブ選択ダイアログ(WinPE完全対応)
# ============================================================
function Select-Drive {
$drivedlg = New-Object System.Windows.Forms.Form
$drivedlg.Text = "Select Drive"
$drivedlg.Size = New-Object System.Drawing.Size(360,260)
$drivedlg.StartPosition = "CenterScreen"
$drvList = New-Object System.Windows.Forms.ListBox
$drvList.Location = New-Object System.Drawing.Point(10,10)
$drvList.Size = New-Object System.Drawing.Size(320,170)
$drvList.SelectionMode = "One"
$drivedlg.Controls.Add($drvList)
$drvokBtn = New-Object System.Windows.Forms.Button
$drvokBtn.Text = "OK"
$drvokBtn.Location = New-Object System.Drawing.Point(170,190)
$drivedlg.Controls.Add($drvokBtn)
$drvcancelBtn = New-Object System.Windows.Forms.Button
$drvcancelBtn.Text = "Cancel"
$drvcancelBtn.Location = New-Object System.Drawing.Point(250,190)
$drivedlg.Controls.Add($drvcancelBtn)
$choiceDrive = @()
#容量付きでディスクドライブ列挙
$diskdrv=get-disk | select-object -property Number,FriendlyName,SerialNumber,Size | sort-object Number
foreach ($d in $diskdrv) {
$driveNo = $d.Number
$driveName =$d.FriendlyName
$drvsizeGB = [math]::Round($d.Size/(1024*1024*1024),1)
$drvList.Items.Add("$driveNo $driveName $drvsizeGB GB")
$choiceDrive += $driveNo
}
# MouseUp で選択確定(WinPE対策)
$drvList.Add_MouseUp({
$idxx = $drvList.IndexFromPoint($drvList.PointToClient([System.Windows.Forms.Cursor]::Position))
if ($idxx -ge 0) { $drvList.SelectedIndex = $idxx }
})
$drvokBtn.Add_Click({
if ($drvList.SelectedIndex -ge 0) {
$drivedlg.Tag = $diskdrv[$drvList.SelectedIndex].Number
} else {
$drivedlg.Tag = $null
}
$drivedlg.Close()
})
$drvcancelBtn.Add_Click({
$drivedlg.Tag = $null
$drivedlg.Close()
})
$drivedlg.ShowDialog() | Out-Null
$resultdrv = $drivedlg.Tag
if ($resultdrv -is [array]) { $resultdrv = $resultdrv[-1] }
return $resultdrv
}
これを実行すると以下のようなダイアログが表示されます。なお、WindowsPEでは「選択した」というイベントがうまく扱えないので、選択した後でマウスが扱われた(MouseUPイベント)で処理するようにしています(AIにお聞きしております)。


