将变量传递给register-objectevent动作块

Sob*_*ath 5 powershell

我实际上试图每隔50秒运行一次计时器(lmd).但是当我按下ctrl + c时,计时器仍然继续在其动作块中打印消息.所以我写了另一个计时器(ctrlc),每秒运行一次并寻找任何按下的ctrlc.然后取消注册lmd计时器和ctrl计时器.并将TreatControlCAsInput重置为false.但我在ctrlc计时器动作块中有一个问题.我无法触发RemoveTimer功能.请建议:)

# Disables the timer and unregisters the event subscriber
function RemoveTimer ($timerin, $sourceidentifier) {
     Write-Host "Inside RemoveTimer $sourceidentifier"
    try {
        $timerin.Enabled = $False
        Unregister-Event -SourceIdentifier $sourceidentifier
    } Catch {
    Write-Host "Error occurred while stopping timer $($_.Exception.Message)"
}
}

# Disables the timer and unregisters the event subscriber
function RemoveTimer1 {
    Write-Host "Inside RemoveTimer1"
}

# LMD Timer
try {
    $lmdtimer = New-Object Timers.Timer
    $lmdtimer.Interval = 50000
    $registerevent = Register-ObjectEvent -InputObject $lmdtimer -EventName Elapsed -SourceIdentifier LMDTimer.Output -Action {
        Write-Debug "$($Event | Out-String)"
        Write-Host "Script is running"
    }
    $lmdtimer.Enabled = $True
    Write-Debug "$($lmdtimer | Out-String)"
} Catch {
    Write-Host "Error occurred while starting LMDTimer $($_.Exception.Message)"
    RemoveTimer $lmdtimer "LMDTimer.Output"
}

# CTRLC Timer
try {
    [console]::TreatControlCAsInput = $true
    $ctrlctimer = New-Object Timers.Timer
    $ctrlctimer.Interval = 1000
    $params = new-object psobject -property @{RemoveTimer1 = $function:RemoveTimer1}
    $registerevent = Register-ObjectEvent -InputObject $ctrlctimer -EventName Elapsed -SourceIdentifier CTRLCTimer.Output -MessageData $function:RemoveTimer1 -Action {
        if ($Host.UI.RawUI.KeyAvailable -and (3 -eq [int]$Host.UI.RawUI.ReadKey("AllowCtrlC,IncludeKeyUp,NoEcho").Character))
        {
          Write-Host "Removing LMDTimer and CTRLCTimer"
          try {
              #RemoveTimer $lmdtimer "LMDTimer.Output"
              #RemoveTimer $ctrlctimer "CTRLCTimer.Output"
              $Event.MessageData.RemoveTimer1
          } Catch {
              Write-Host $_.Exception.Message
          }
          Write-Host "Removing TreatControlCAsInput"
          [console]::TreatControlCAsInput = $false
          exit
        }
    }
    $ctrlctimer.Enabled = $True
    Write-Debug "$($ctrlctimer | Out-String)"
} Catch {
    Write-Host "Error occurred while starting CTRLCTimer $($_.Exception.Message)"
    RemoveTimer $ctrlctimer "CTRLCTimer.Output"
    [console]::TreatControlCAsInput = $false
}

for ($i=0;$i -lt 4000;$i++) {
    Write-Host "$i"
}

RemoveTimer $lmdtimer "LMDTimer.Output"
RemoveTimer $ctrlctimer "CTRLCTimer.Output"
[console]::TreatControlCAsInput = $false
Run Code Online (Sandbox Code Playgroud)

Pau*_*aul 7

您可以使用该-MessageData参数将信息传递给scriptblock:

$pso = new-object psobject -property @{foo = $foo; bar = $bar}
Register-ObjectEvent... -messagedata $pso
Run Code Online (Sandbox Code Playgroud)

之后你应该能够在Scriptblock中访问它,如下所示:

$Event.MessageData.foo
Run Code Online (Sandbox Code Playgroud)