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ボタンを押すと、このフォルダ選択ダイアログが出る仕組みとなっています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です