我正在使用powershell中的一个简单的winforms应用程序执行以下操作:
我在winforms中嘲笑它并遇到了计时器的问题:
以下是范围界定问题的简单代码示例:
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()
问题:
答案 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
")