我正在尝试创建一个允许我弹出的功能,请等待消息,再运行一些脚本,然后关闭弹出窗口
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中有关,但是我不知道如何使用表单
答案 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)