PowerShell Winforms定时器范围问题与变量

时间:2017-08-08 04:31:25

标签: winforms powershell

我正在使用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()

问题:

  1. 任何想法如何解决这个范围问题,以保持传递这些值?我确信我忽视了一种简单的方法,但我似乎无法按计划工作。
  2. 如果我尝试运行4个不同的计时器,是否有任何我在WinForm计时器控件中忽略的问题?如果是这样,我应该使用另一个可以帮助我完成此操作的计时器控件吗?

1 个答案:

答案 0 :(得分:1)

我发现您的脚本有两个问题:

  • 每次重启时都会覆盖一个(全局)计时器。这意味着您可能希望将$timer = New-Object System.Windows.Forms.Timer放在Fun1函数中 注意:每次重新启动计时器时都可能会漏掉一些,如果你关心这个,你可能需要构建类似自毁的东西

  • 您的$timerSB命令在计时器结束时进行评估,但同时$ComputerName可能已被更改。为此,您可能必须构建创建ScriptBlock,以便在计时器启动时评估$ComputerName

$timerSB = [ScriptBlock]::Create("
    write-host ""Computername: $computername in timerSB"" -ForegroundColor cyan
    fun2 -ComputerName $computername
")