Windows PEでバックアップ・リストア(4)
次に、フォルダ選択ダイアログの関数の定義です。Windows上ではフォルダ選択ダイアログはそんなに難しくはありませんが、WindowsPEでは機能が制限されているためそう簡単にはできません。したがって、以下のようなまどろっこしい書き方となっています。こちらもAIに聞きながら実現しています。
# ============================================================
# 自作フォルダ選択ダイアログ(WinPE完全対応)
# ============================================================
function Select-Folder {
$dlg = New-Object System.Windows.Forms.Form
$dlg.Text = "Select Drive"
$dlg.Size = New-Object System.Drawing.Size(360,260)
$dlg.StartPosition = "CenterScreen"
$driveList = New-Object System.Windows.Forms.ListBox
$driveList.Location = New-Object System.Drawing.Point(10,10)
$driveList.Size = New-Object System.Drawing.Size(320,170)
$driveList.SelectionMode = "One"
$dlg.Controls.Add($driveList)
$okBtn = New-Object System.Windows.Forms.Button
$okBtn.Text = "OK"
$okBtn.Location = New-Object System.Drawing.Point(170,190)
$dlg.Controls.Add($okBtn)
$cancelBtn = New-Object System.Windows.Forms.Button
$cancelBtn.Text = "Cancel"
$cancelBtn.Location = New-Object System.Drawing.Point(250,190)
$dlg.Controls.Add($cancelBtn)
$DrivePaths = @()
# 容量付きでドライブ列挙(ルートのみ)
$vols = Get-WmiObject Win32_LogicalDisk | Where-Object { $_.DriveType -eq 2 -or $_.DriveType -eq 3 }
foreach ($v in $vols) {
$drive = $v.DeviceID + "\"
$sizeGB = [math]::Round(($v.Size / 1GB), 1)
$freeGB = [math]::Round(($v.FreeSpace / 1GB), 1)
$driveList.Items.Add("$drive ($freeGB GB free / $sizeGB GB)")
$DrivePaths += $drive
}
# MouseUp で選択確定(WinPE対策)
$driveList.Add_MouseUp({
$idx = $driveList.IndexFromPoint($driveList.PointToClient([System.Windows.Forms.Cursor]::Position))
if ($idx -ge 0) { $driveList.SelectedIndex = $idx }
})
$okBtn.Add_Click({
if ($driveList.SelectedIndex -ge 0) {
$dlg.Tag = $DrivePaths[$driveList.SelectedIndex]
} else {
$dlg.Tag = $null
}
# ★ 配列なら最後の要素に正規化
if ($dlg.Tag -is [array]) {
$dlg.Tag = $dlg.Tag[-1]
}
$dlg.Close()
})
$cancelBtn.Add_Click({
$dlg.Tag = $null
$dlg.Close()
})
$dlg.ShowDialog() | Out-Null
$result = $dlg.Tag
if ($result -is [array]) { $result = $result[-1] }
return $result
}こちらはMain FormのBrowseボタンを押すと、このフォルダ選択ダイアログが出る仕組みとなっています。


