Я наблюдаю какое-то странное поведение с тестом, который работает уже много лет. Тест предназначен для Autodesk Revit, который может использовать файлы журнала для автоматизации задач и регистрации времени. Эталонный тест будет считывать файл XML для серии модульных файлов журналов, которые могут обрабатываться в различных последовательностях в зависимости от того, какие функции Revit необходимо протестировать. В результате Revit запускается с разными журналами и закрывается по завершении каждого журнала для повторного запуска со следующим журналом. Я использовал Start-Process
с опцией -wait
в таком цикле...
$exitCode = (Start-Process -FilePath:$executable -argumentList:"`"$journalFile`"" -wait -errorAction:stop -PassThru).ExitCode
Что происходит в последнее время, так это ОЧЕНЬ длинные паузы между завершением журнала и закрытием Revit и возвращением управления в PowerShell, чтобы можно было запустить следующий журнал. Например, иногда 3-5 минут, что становится проблемой, когда нужно обработать 10 разных журнальных файлов. Кажется, это происходит только в Windows 10, но я еще не смог проверить, ограничено ли это конкретной сборкой или все Windows 10 ведут себя таким образом.
Я нашел несколько ссылок на то, что Start-Process -wait
проблематичен, поэтому я начал искать альтернативы.
Сначала я попробовал...
$process = Start-Process -FilePath:$executable -argumentList:"`"$journalFile`""
Wait-Process $process
Но это, похоже, не ждет. Revit запускается несколько раз параллельно, и, поскольку каждый журнал иногда зависит от файлов, созданных в предыдущих, это не удается. Итак, я нашел ссылку на использование [System.Diagnostics.ProcessStartInfo]
вот так...
$processInfo = New-Object System.Diagnostics.ProcessStartInfo
$processInfo.RedirectStandardError = $true
$processInfo.RedirectStandardOutput = $true
$processInfo.UseShellExecute = $false
$process = New-Object System.Diagnostics.Process
с этим в петле...
$processInfo.FileName = $executable
$processInfo.Arguments = "`"$journalFile`""
$process.StartInfo = $processInfo
[Void]$process.Start()
$process.WaitForExit()
exitCode = $process.ExitCode
Кажется, это решает проблему ожидания, но приводит к тому, что Revit не может обработать один конкретный журнал всегда в одном и том же месте. Но это не имеет смысла, так как я предполагаю, что Revit может не знать, как он был запущен.
Есть ли у кого-нибудь какие-либо предложения о том, что я могу делать неправильно с любым из этих подходов, или с третьим вариантом, который я должен попробовать? И есть ли у кого-нибудь достоверная информация о том, что не так с Start-Process -wait
?