【发布时间】:2021-06-24 10:54:21
【问题描述】:
我在脚本中包含了一个进度条。当我运行脚本时,该栏存在(因为当我使用 Alt+Tab 浏览打开的窗口时会列出相关窗口)但我无法选择并查看它。
这是我的代码块...
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
Add-Type -AssemblyName PresentationFramework
[...]
# progress bar
$form_bar = New-Object System.Windows.Forms.Form
$form_bar.Text = "TRANSFER RATE"
$form_bar.Size = New-Object System.Drawing.Size(600,200)
$form_bar.StartPosition = "manual"
$form_bar.Location = '1320,840'
$font = New-Object System.Drawing.Font("Arial", 12)
$form_bar.Font = $font
$label = New-Object System.Windows.Forms.Label
$label.Location = New-Object System.Drawing.Point(20,20)
$label.Size = New-Object System.Drawing.Size(550,30)
$form_bar.Controls.Add($label)
$bar = New-Object System.Windows.Forms.ProgressBar
$bar.Style="Continuous"
$bar.Location = New-Object System.Drawing.Point(20,70)
$bar.Maximum = 101
$bar.Size = New-Object System.Drawing.Size(550,30)
$form_bar.Controls.Add($bar)
$form_bar.Topmost = $true
$form_bar.Show() | out-null
$form_bar.Focus() | out-null
[...]
$percent = ($trasferred_bytes / $total_bytes)*100
$formatted = '{0:0.0}' -f $percent
[int32]$progress = $percent
$CurrentTime = $Time.Elapsed
$estimated = [int]((($CurrentTime.TotalSeconds/$percent) * (100 - $percent)) / 60)
$label.Text = "Progress: $formatted% - $estimated mins to end"
if ($progress -ge 100) {
$bar.Value = 100
} else {
$bar.Value = $progress
}
$form_bar.Refresh()
【问题讨论】:
-
这可能是因为它与脚本的其余部分在一个进程中运行。这意味着你必须让你的脚本事件驱动甚至多线程参见:How to handle progress bar using PowerShell?
-
$CurrentTime = $Time.Elapsed: 错误的计时器。使用 System.Windows.Forms.Timer。或者将 System.Timers.Timer 的 SynchronizingObject 属性设置为 Form 实例。 -- 不需要Refresh()表单,ProgressBar 已经自己完成了。
标签: powershell winforms progress-bar