带变量的PowerShell Winforms计时器作用域问题
我正在powershell中开发一个简单的winforms应用程序,以执行以下操作:带变量的PowerShell Winforms计时器作用域问题,winforms,powershell,Winforms,Powershell,我正在powershell中开发一个简单的winforms应用程序,以执行以下操作: 用按钮显示4个独立的计算机名称 按钮应启动计算机名称的计时器 当计时器结束时,它应该告诉计算机名发出远程命令 基本的想法是,他们可以在几分钟内为每台机器填写一个计时器,按下启动按钮,一旦时间到了,就会向机器发出关闭命令 我在winforms中模拟了它,并遇到了计时器问题: 我使用一个按钮来调用带有参数的函数 然后,该函数启动计时器并添加计时器滴答事件 tick事件尝试使用函数中的参数,但其值为null
- 用按钮显示4个独立的计算机名称
- 按钮应启动计算机名称的计时器
- 当计时器结束时,它应该告诉计算机名发出远程命令
- 基本的想法是,他们可以在几分钟内为每台机器填写一个计时器,按下启动按钮,一旦时间到了,就会向机器发出关闭命令
- 我使用一个按钮来调用带有参数的函数
- 然后,该函数启动计时器并添加计时器滴答事件
- tick事件尝试使用函数中的参数,但其值为null
Add-Type -AssemblyName System.Windows.Forms
$Form = New-Object system.Windows.Forms.Form
$Form.Text = "Form"
$Form.BackColor = "#6c6b6b"
$Form.TopMost = $true
$Form.Width = 800
$Form.Height = 600
$timer = New-Object System.Windows.Forms.Timer
$timer.Interval = 5000
function fun1
{
param($computername)
write-host "Computername: $computername in fun1" -ForegroundColor Green
$timerSB = {
write-host "Computername: $computername in timerSB" -ForegroundColor cyan
fun2 -ComputerName $computername
}
$script:timer.add_tick($timerSB)
$script:timer.Start()
}
function fun2
{
param($computername)
write-host "Computername: $computername in fun2" -ForegroundColor yellow
}
fun1 -computername localhost
[void]$Form.ShowDialog()
$timer.Dispose()
$Form.Dispose()
问题:
我发现您的脚本存在两个问题:
- 您有一个(全局)计时器,每次重新启动时都会覆盖该计时器。这意味着您可能希望将
放在$timer=newobjectsystem.Windows.Forms.timer
函数中Fun1
注意:每次重新启动计时器时,您可能会出现一些泄漏,如果您关心这一点,您可能需要构建类似自毁的东西 - 您的
命令在计时器结束时进行计算,但同时$timerSB
可能已更改。为此,您可能需要创建一个$ComputerName
,在计时器启动时计算ScriptBlock
:$ComputerName
请说明您正在使用哪个版本的PowerShell,好吗?毫无疑问,微软PowerShell在线文档中有很多例子:谢谢!在生成scriptblock时,我试图找出如何提取$computername的本地值,我甚至没有想到只调用scriptblock类型。gloabl计时器只是为了确保复制/粘贴我的样本的人不会遇到处置问题。
$timerSB = [ScriptBlock]::Create("
write-host ""Computername: $computername in timerSB"" -ForegroundColor cyan
fun2 -ComputerName $computername
")