Таймер Powershell для регистратора производительности Windows (WPR)

Я делаю таймер, который подсчитывает миллисекунды, и когда миллисекунды достигают своего конца, он останавливает скрипт. Почему я не хочу, чтобы код повторялся до тех пор, пока он не закончился, это потому, что регистратор производительности 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

у вас есть лучший способ решить мою проблему?

1 ответ

Я далек от эксперта по удаленному выполнению кода, но мне кажется, что после последней строки в вашем блоке сценариев $timer.Start(), сеанс PowerShell в удаленной системе завершается, а вместе с ним и ваш объект таймера и обработчик событий.

Вместо этого попробуйте использовать сеанс PSSession, который можно поддерживать даже после завершения кода.

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

Позже очистите сеанс, используя Remove-PSSession $session

Другие вопросы по тегам