在Powershell中创建弹出消息

时间:2019-03-05 23:24:06

标签: function powershell popup global-functions

我正在尝试创建一个允许我弹出的功能,请等待消息,再运行一些脚本,然后关闭弹出窗口

Function Popup-Message {

    param ([switch]$show,[switch]$close)

    Add-Type -AssemblyName System.Windows.Forms  

    # Build Form
    $objForm = New-Object System.Windows.Forms.Form
    $objForm.Text = "Test"
    $objForm.Size = New-Object System.Drawing.Size(220,100)

    # Add Label
    $objLabel = New-Object System.Windows.Forms.Label
    $objLabel.Location = New-Object System.Drawing.Size(80,20) 
    $objLabel.Size = New-Object System.Drawing.Size(100,20)
    $objLabel.Text = "Hi there!"
    $objForm.Controls.Add($objLabel)



    If ($show)
    {
        $objForm.Show() | Out-Null
        $global:test = "Show"
    }


    If ($close)
    {
        # destroy form
        $objForm.Close() | Out-Null
        $global:test = "Close"
    }
}

然后我可以通过以下方式显示弹出窗口:

Popup-Message -show

此时,我可以看到 $ test 变量为显示

但是当我尝试使用以下方法关闭窗口时:

Popup-Message -close

但是弹出窗口不会关闭 如果我再次查看 $ test ,它将显示为关闭

我假设这与将函数保留在Global Scope中有关,但是我不知道如何使用表单

3 个答案:

答案 0 :(得分:1)

您将在每次对Popup-Message的调用中创建表单的新实例。因此,该表单未关闭,因为您正试图关闭从未打开过的新表单。同时,旧表格不再有任何人引用它,而是在太空中闲坐。您可以创建一个如下所示的全局引用,可能有更巧妙的方法。

Function Popup-Message {

param ([switch]$show,[switch]$close)

Add-Type -AssemblyName System.Windows.Forms  

# Build Form
if ($Global:objForm -eq $null){
$Global:objForm = New-Object System.Windows.Forms.Form
$Global:objForm.Text = "Test"
$Global:objForm.Size = New-Object System.Drawing.Size(220,100)

# Add Label
$Global:objLabel = New-Object System.Windows.Forms.Label
$Global:objLabel.Location = New-Object System.Drawing.Size(80,20) 
$Global:objLabel.Size = New-Object System.Drawing.Size(100,20)
$Global:objLabel.Text = "Hi there!"
$Global:objForm.Controls.Add($objLabel)
}



If ($show)
{
    $Global:objForm.Show() | Out-Null
    $global:test = "Show"
}


If ($close)
{
    # destroy form
    $Global:objForm.Close() | Out-Null
    $global:test = "Close"
}
}

答案 1 :(得分:0)

kpogue's helpful answer很好地解释了您的问题,并提供了一种有效的解决方案,但由于依赖于全局变量,因此效果不佳。

让我建议另一种方法,在该方法中,您可以使用函数简单地定义表单并返回该定义,您可以在其中调用.Show().Close() 方法(根据需要):

Function New-PopUpForm {

  Add-Type -AssemblyName System.Windows.Forms  

    # Create the form.
    $objForm = New-Object System.Windows.Forms.Form -Property @{
      Text = "Test"
      Size = New-Object System.Drawing.Size 220,100
    }

    # Create a label...
    $objLabel = New-Object System.Windows.Forms.Label -Property @{
      Location = New-Object System.Drawing.Size 80,20
      Size = New-Object System.Drawing.Size 100,20
      Text = "Hi there!"
    }

    # ... and add it to the form.
    $objForm.Controls.Add($objLabel)

    # Return the form.
    return $objForm
}

然后可以按如下方式使用该功能:

$form = New-PopupForm

$form.Show() 

# ...

$form.Close()

请注意,一旦调用.Close(),存储在$form中的表单实例将被处理并且无法重复使用-只需再次调用New-PopupForm即可创建一个新实例。

答案 2 :(得分:0)

我们可以使用一行使用Wscript.Shell COM对象创建powershell弹出窗口

语法: intButton = objShell.Popup(strText,[nSecondsToWait],[strTitle],[nType])

#creating object os WScript
$wshell = New-Object -ComObject Wscript.Shell -ErrorAction Stop
#invoking the POP method using object
$wshell.Popup("please wait message?",5,"Wait Until Scrip execution",48+4)