gpt4 book ai didi

powershell - 将变量传递给 register-objectevent 操作 block

转载 作者:行者123 更新时间:2023-12-04 18:05:17 25 4
gpt4 key购买 nike

我实际上试图每 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

最佳答案

您可以使用 -MessageData将信息传递给脚本块的参数:

$pso = new-object psobject -property @{foo = $foo; bar = $bar}
Register-ObjectEvent... -messagedata $pso

之后,您应该能够像这样在 Scriptblock 中访问它:
$Event.MessageData.foo

关于powershell - 将变量传递给 register-objectevent 操作 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30366745/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com