带变量的PowerShell Winforms计时器作用域问题

带变量的PowerShell Winforms计时器作用域问题,winforms,powershell,Winforms,Powershell,我正在powershell中开发一个简单的winforms应用程序,以执行以下操作: 用按钮显示4个独立的计算机名称 按钮应启动计算机名称的计时器 当计时器结束时,它应该告诉计算机名发出远程命令 基本的想法是,他们可以在几分钟内为每台机器填写一个计时器,按下启动按钮,一旦时间到了,就会向机器发出关闭命令 我在winforms中模拟了它,并遇到了计时器问题: 我使用一个按钮来调用带有参数的函数 然后,该函数启动计时器并添加计时器滴答事件 tick事件尝试使用函数中的参数,但其值为null

我正在powershell中开发一个简单的winforms应用程序,以执行以下操作:

  • 用按钮显示4个独立的计算机名称
  • 按钮应启动计算机名称的计时器
  • 当计时器结束时,它应该告诉计算机名发出远程命令
  • 基本的想法是,他们可以在几分钟内为每台机器填写一个计时器,按下启动按钮,一旦时间到了,就会向机器发出关闭命令
我在winforms中模拟了它,并遇到了计时器问题:

  • 我使用一个按钮来调用带有参数的函数
  • 然后,该函数启动计时器并添加计时器滴答事件
  • 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()
问题:

  • 你知道如何绕过这个范围问题来传递这些值吗?我肯定我忽略了一个简单的方法来实现这一点,但我似乎无法让它按计划工作
  • 如果我尝试运行4个不同的计时器,WinForm计时器控件是否存在任何我忽略的问题?如果是这样的话,我是否应该使用另一个计时器控件来帮助我完成这个任务

  • 我发现您的脚本存在两个问题:

    • 您有一个(全局)计时器,每次重新启动时都会覆盖该计时器。这意味着您可能希望将
      $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
    ")