我实际上试图每隔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)
您可以使用该-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)
| 归档时间: |
|
| 查看次数: |
2062 次 |
| 最近记录: |