我试图使用一些.net在powershell中创建一个GUI,并且考虑到我编写基于GUI的程序的经验,我在更新标签时遇到了麻烦。
我只是制作一个带标签的简单表单,我希望每次读取文件夹名称时都要替换标签。我们的想法是模仿程序的状态窗口,该程序需要一些时间来运行并使用有关程序进度的信息更新面板。
这是我的代码:
$form = New-Object System.Windows.Forms.Form
$form.Height = 350
$form.Width = 600
$label = New-Object System.Windows.Forms.Label
$label.Text = "first label"
$form.Controls.Add($label)
$form.showDialog()
$dir = ls C:\ -Directory
[int]$i = 0
while($i -lt $dir.Count) {
$label.Text = $dir[$i].Name
$form.Controls.Add($label)
$form.paint
sleep 3 # Added this just to make sure I'm not missing the display
$i++
}
我认为需要调用绘画,但我不确定如何更新GUI。
答案 0 :(得分:1)
以下是您的问题的答案。我将$form.ShowDialog()
替换为$form.Show()
。我也在最后添加了$form.Close()
,但结果对我来说并不是那么好;看看最终的PowerShell解决方案。
[void][Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
$form = New-Object System.Windows.Forms.Form
$form.Height = 350
$form.Width = 600
$label = New-Object System.Windows.Forms.Label
$label.Text = "first label"
$form.Controls.Add($label)
$form.Show()
$dir = ls C:\ -Directory
[int]$i = 0
while($i -lt $dir.Count) {
$label.Text = $dir[$i].Name
$form.Controls.Add($label)
#$form.paint
sleep 1 # Added this just to make sure I'm not missing the display
$i++
}
$form.Close()
编码建议:考虑使用 foreach 循环,尽管 while 循环此处foreach ($file in $dir)
。此处无需键入$i
作为int
。在脚本中尝试使用CmdLet全名(Get-ChilItem),而不是别名(ls,dir ...),即使它们是常见的别名,它也更具可读性。不要感到沮丧,你可以忘记这一点; o)
现在我的建议就决定处理问题的方式。 PowerShell提供了一些显示进度的东西。这是一个小例子:
$dirs = Get-ChildItem C:\ -Directory
$i = 0
foreach($dir in $dirs)
{
Write-Progress -Activity "looking for Directories" -status "Found $($dir.fullname)" -percentComplete ($i*100 / $dirs.count)
sleep 1 # Added this just to make sure I'm not missing the display
$i++
}