1

我正在做一个以毫秒计的计时器,当毫秒到达终点时,它会停止脚本。为什么我不会重复代码直到完成它,因为 Windows 性能记录器正在幕后工作,而 wpr 正在与时间一起工作,我们必须手动停止 wpr。问题是我的计时器在远程启动时不会停止 WPR。计时器在本地工作得很好。

这里是下面的代码:

$scriptwpr =  {
            wpr -start cpu
            function Stop-Script
            {
                Write-Host "Called Stop-Script."
                wpr -stop C:\$env:computername-PerformanceAnalyzer.etl
                #[System.Management.Automation.Runspaces.Runspace]::DefaultRunspace.CloseAsync()
           }

            $elapsedEventHandler = {

                param ([System.Object]$sender, [System.Timers.ElapsedEventArgs]$e)
                Write-Host "Event handler invoked."
                ($sender -as [System.Timers.Timer]).Stop()
                Unregister-Event -SourceIdentifier Timer.Elapsed
                Stop-Script
            }

            $timer = New-Object System.Timers.Timer -ArgumentList 120000 # setup the timer to fire the elapsed event after 20 minutes
            Register-ObjectEvent -InputObject $timer -EventName Elapsed -SourceIdentifier Timer.Elapsed -Action $elapsedEventHandler
            $timer.Start()
 }

Invoke-command -script $scriptwpr -computer computernamehere

你有更好的方法来解决我的问题吗?

4

1 回答 1

0

我远不是远程代码执行方面的专家,但是在我看来,在您的 scriptblock 的最后一行之后,$timer.Start()远程系统上的 powershell 会话结束,并且您的计时器对象和事件处理程序随之结束。

尝试使用 PSSession ,即使在您的代码运行完成后也可以保持活动状态

$session = New-PSSession -ComputerName computernamehere
Invoke-Command -script $scriptwpr -Session $session

稍后通过使用清理您的会话Remove-PSSession $session

于 2021-04-24T02:45:51.320 回答