首页 > 解决方案 > start-sleep 将冻结 Register-ObjectEvent 动作脚本块

问题描述

   $EventHandlerScripBlock = {
            if (! [String]::IsNullOrEmpty($EventArgs.Data)) {
                $EventArgs.Data
            }
        }

        $ProcessStdOutEvent = Register-ObjectEvent -InputObject $Process -Action $EventHandlerScripBlock -EventName 'OutputDataReceived'

            $emptyStopWatch = [Diagnostics.Stopwatch]::StartNew()
            while($true)
            {
                start-sleep -s 10
                [array]$output = receive-job $ProcessStdOutEvent 
                if ($output)
                {
                    $output
                    $emptyStopWatch.Restart()
                }
                elseif ($emptyStopWatch.elapsed.TotalMilliseconds -gt $OutputCheckIntervalInMs)
                {
                    break;
                }
            }

我想启动一个进程并读取它的标准输出。我无法直接从进程读取标准输出,$process.standardoutput.ReadToEnd()因为它会阻塞并等待进程退出。所以我需要像上面的代码一样使用异步样式。但我发现start-sleep -s 10会阻止EventHandlerScripBlock执行。如果我删除start-sleep -s 10,它是否过于频繁地读取输出?

标签: powershell

解决方案


推荐阅读