我想使用Windows窗体在PowerShell中创建一个图形界面。我正在处理一个进度条,我想使用ProgressBar解决这个问题。
我的问题是,当我调用Run函数时,GUI进度条与$ProgressBar.Value值不同步。当第一个$ProgressBar.PerformStep()命令运行时,$ProgressBar.Value值已为1,但GUI进度条尚未移动。()命令时,$ProgressBar.Value值为2,但GUI仍显示值1。当第三个PerformStep()运行时,$ProgressBar.Value为3,但GUI仍为2。在运行最后一个命令(Start-Sleep 3)后,GUI最终更新并赶上$ProgressBar.Value值(3)。
(The函数只是一个示例,在真实的代码中将应用ForEach循环。)
下面是示例代码:
function Run {
$ProgressBar.Maximum = 3
$ProgressBar.Step = 1
$ProgressBar.PerformStep()
Write-Host $ProgressBar.Value
Start-Sleep 3
$ProgressBar.PerformStep()
Write-Host $ProgressBar.Value
Start-Sleep 3
$ProgressBar.PerformStep()
Write-Host $ProgressBar.Value
Start-Sleep 3
}
$MainForm = New-Object System.Windows.Forms.Form -Property @{
Text = "Form"
ClientSize = "400, 600"
}
$ProgressBar = New-Object System.Windows.Forms.ProgressBar -Property @{
Location = New-Object System.Drawing.Point(60, 65)
Size = New-Object System.Drawing.Size(180, 10)
}
$ButtonRun = New-Object System.Windows.Forms.Button -Property @{
Location = New-Object System.Drawing.Point(150, 530)
Size = New-Object System.Drawing.Size(100, 40)
Text = "Run"
}
$ButtonRun.Add_Click({Run})
$MainForm.Controls.AddRange(($ProgressBar, $ButtonRun))
$MainForm.ShowDialog()
我试过在$ProgressBar.PerformStep()之后使用$ProgressBar.Refresh()或[System.Windows.Forms.Application]::DoEvents(),但这些都没有帮助。为什么会发生这种情况?我如何才能使这两个东西保持同步?
我根据Jimi的回答修改了这个函数。看起来它可以工作了。代码在技术上是正确的吗?对不起,我对PowerShell和编程还很陌生。
function Run {
$ProgressBar.Maximum = 3
$ProgressBar.Step = 1
for ($i = 1; $i -le 3; $i++) {
$ProgressBar.PerformStep()
[System.Threading.Tasks.Task]::Delay(3000).GetAwaiter().GetResult()
Write-Host $ProgressBar.Value
}
}
1条答案
按热度按时间w1e3prcc1#
根据我的评论,在原始的沙箱虚拟机环境中,默认的只有操作系统的主机。
您不需要所有这些库,但我在这里提供了上下文选项。
https://gifyu.com/image/Sq9gw
更新
然而,如果您的代码更新对您有效,那么这只是供参考。
更新
正如我在我称之为***损坏的环境***(意味着完全加载的用户和/或开发人员工作站、MSOffice、所有最新的uOS更新、开发工具等)上所看到的,在损坏的机器上,您所看到的是可重现的,这意味着在仅安装MSOffice的主机、仅安装开发工具的主机和安装MSOffice+开发工具的主机上。