Powershell显示弹出窗口,并在循环时保持更新弹出窗口的主体

问题描述

我正在尝试使体内的一些数据弹出以显示Powershell。
虽然,我测试了一些方法可以正确地做到这一点。但是在更新弹出消息时,我找不到任何方法来保持循环进度。

请选中下面的消息框。

powershell.png

尽管如此,我不明白为什么png文件没有正确上传。.
因此,我在下面添加了我的powershell代码

PowerShell代码如下。

$msgBoxTitle = "i value"
$i = 0
while(1){
    $msgBoxBody = "
        current i value is : $i
    "
    $i++;
    [System.Windows.MessageBox]::Show($msgBoxBody,$msgBoxTitle)
}

在这种情况下,我想使循环不会在循环进行时停止,并且味精盒体的值会得到更新。

有没有办法做到这一点? 谢谢。

解决方法

这并非微不足道,因为(简单地说)PowerShell在窗体上不能很好地工作。 This anwer解释了原因,并给出了如何显示非阻止表单或消息框的解决方案:

$ps = [PowerShell]::Create()
[void]$ps.AddScript({
    param($Caption,$Text)
    Add-Type -AssemblyName System.Windows.Forms
    [System.Windows.Forms.MessageBox]::Show($Text,$Caption)
})
[void]$ps.AddArgument($msgBoxTitle)
[void]$ps.AddArgument($msgBoxBody)
[void]$ps.BeginInvoke()

但是... 更新表单很棘手,而且我不确定是否有简单的方法。

This的答案提到了showui,这是一个PowerShell模块,但我对此一无所知,这可能对您的问题有些过分。

在PowerShell中显示进度的最佳做法Write-Progress。对您的代码进行一些更新:

$msgBoxTitle = "i value"
$i = 0
while (1) {
    $msgBoxBody = "current i value is : $i"
    $i++;
    Write-Progress -Activity $msgBoxTitle -Status $msgBoxBody
}

(当然,Write-Progress在您知道操作将花费多长时间并且可以指定一个百分比之后会显示进度条,但是效果最好。 )

,

您可以创建自己的弹出表单,而不必使用ShowDialog()方法,而只需使用Show()。 然后,在脚本的其余部分中,更新标签并在处理完成后将其丢弃。

为方便起见,我将代码放在函数中创建示例表单

function Show-MyPopup {
    Add-Type -AssemblyName System.Windows.Forms
    Add-Type -AssemblyName System.Drawing

    $form = New-Object System.Windows.Forms.Form
    $form.Size = New-Object System.Drawing.Size(400,200)
    $form.FormBorderStyle = 'FixedSingle'
    $form.StartPosition = 'CenterScreen'
    $form.TopMost = $true
    $form.ControlBox = $False
    $form.Text = 'i value'

    $label = New-Object System.Windows.Forms.Label
    $label.Size = New-Object System.Drawing.Size(360,22)  # or write '360,22'
    $label.Left = ($form.Width - $label.Width) / 2
    $label.Top = ($form.Height - $label.Height * 2) / 2
    $label.Text = 'Current i value is: 0'
    # in order to address this control later,you must Name it
    $label.Name = 'Label1'
    $form.Controls.Add($label)

    $button = New-Object System.Windows.Forms.Button 
    $button.Size = New-Object System.Drawing.Size(75,24)
    $button.Left = $form.Width - $button.Width - 20
    $button.Top = $form.Height - $button.Height * 3
    $button.Text = 'Exit'
    $button.Add_Click({ $form.Close() })
    $form.Controls.Add($button)
    $form.AcceptButton = $button
    $form.Show()
    # return the form object to the calling script
    $form
}

将其放置在适当的位置,然后在其下面编写控制表单的其余脚本:

# call the function to show the popup and capture the form itself in a variable
$popup = Show-MyPopup
for ($i = 1; $i -le 10; $i++) {
    # update the label using the form's Controls collection
    $popup.Controls.Item('Label1').Text = "Current i value is: $i"
    # do what needs to be done here.
    # for demo,just sleep for one second
    Start-Sleep -Seconds 1
}

# very important! remove the form from memory when done
$popup.Dispose()
$popup = $null