PowerShell 表单 - 垂直进度条

PowerShell Forms - Vertical Progress Bar

这是关于 PowerShell 中的 Windows 表单和 System.Windows.Forms.ProgressBar。

我找遍了,找不到任何可以让进度条垂直填充的东西。我考虑过替代方案(例如调整带有背景颜色的标签的大小),但如果可能的话,我更喜欢使用已经具有 class 的内容。我可以发誓我以前见过这样的东西,即使它不是真正的进度条。我不是用它来跟踪进度,而是更多地用于 CPU 使用情况、RAM 使用情况和驱动器 space 服务器状态。这是一个有用的 GUI,用于从下拉列表中快速报告服务器,我不必打开另一个完整的 shell 会话(我有足够的 shells 打开,因为它在 O365 之间eDiscovery、数据分析和其他需求)。感谢您提前提出任何建议。

这是一个很好的 C# 答案How do I make a winforms progress bar move vertically in C#?

它覆盖了 CreateParams 方法以在 Style 中设置 PBS_VERTICAL 标志。 不幸的是,要使其在 PowerShell 中运行,您将不得不使用一些 C# 代码。

这对我有用:

$type = @'
using System; 
using System.Windows.Forms; 

public class VerticalProgressBar : ProgressBar { 
  protected override CreateParams CreateParams { 
    get { 
      CreateParams cp = base.CreateParams; 
      cp.Style |= 0x04; 
      return cp; 
    } 
  } 
}
'@

Add-Type -TypeDefinition $type -ReferencedAssemblies System.Drawing,System.Data,System.Windows.Forms

$userForm = New-Object System.Windows.Forms.Form
$userForm.Text = "$title"
$userForm.Size = New-Object System.Drawing.Size(230,300)
$userForm.StartPosition = "CenterScreen"
$userForm.AutoSize = $False
$userForm.MinimizeBox = $False
$userForm.MaximizeBox = $False
$userForm.SizeGripStyle= "Hide"
$userForm.WindowState = "Normal"
$userForm.FormBorderStyle="Fixed3D"
$progressbar = New-Object 'VerticalProgressBar'
$progressbar.Location = New-Object System.Drawing.Point(180, 50); 
$progressbar.Width = 20
$progressbar.Height = 200
$userForm.Controls.Add($progressbar)

$TrackBar = New-Object 'System.Windows.Forms.TrackBar'
$TrackBar.Location = New-Object System.Drawing.Point(10, 10); 
$TrackBar.Width = 200
$TrackBar.add_ValueChanged({$progressbar.Value = $this.value*10})
$userForm.Controls.Add($TrackBar)

$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = New-Object System.Drawing.Size(10,220)
$OKButton.Size = New-Object System.Drawing.Size(75,23)
$OKButton.Text = "OK"
$OKButton.Add_Click({$userForm.Close()})
$userForm.Controls.Add($OKButton)


$userForm.ShowIcon = $False
$userForm.Add_Shown({$userForm.Activate()})
$userForm.AcceptButton = $OKButton
[void] $userForm.ShowDialog()