Проблемы с запуском процесса - ожидание в Autodesk Revit - PullRequest
1 голос
/ 14 июля 2020

Я наблюдаю странное поведение с эталонным тестом, который работал годами. Тест предназначен для Autodesk Revit, который может использовать файлы журнала для автоматизации задач и времени ведения журнала. Тест будет читать файл XML для серии файлов модульного журнала, которые могут обрабатываться в различных последовательностях в зависимости от того, какие функции Revit нужно тестировать. В результате Revit запускается с разными журналами и закрывается по завершении каждого журнала для повторного запуска со следующим журналом. Я использовал Start-Process с опцией -wait в al oop вот так ...

$exitCode = (Start-Process -FilePath:$executable -argumentList:"`"$journalFile`"" -wait -errorAction:stop -PassThru).ExitCode

В последнее время происходили ОЧЕНЬ длинные паузы между завершением и закрытием журнала. Revit и управление возвращаются в PowerShell, чтобы можно было запустить следующий журнал. Например, иногда 3-5 минут, что становится проблемой, когда нужно обработать 10 разных файлов журнала. Похоже, это происходит только в Windows 10, но я еще не смог проверить, ограничено ли это определенной сборкой c, или все Windows 10 ведут себя таким образом.

I нашли некоторые ссылки на Start-Process -wait, являющиеся проблемными c, поэтому я начал искать альтернативы.

Сначала я попробовал ...

$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

с этим в l oop ...

$processInfo.FileName = $executable
$processInfo.Arguments = "`"$journalFile`""
$process.StartInfo = $processInfo
[Void]$process.Start()
$process.WaitForExit()
exitCode = $process.ExitCode

Кажется, это решает подождите, но в результате Revit не сможет обработать один конкретный журнал, всегда в одном и том же месте. Но это не имеет смысла, поскольку я предполагаю, что Revit может не знать, как он был запущен.

Есть ли у кого-нибудь предложения по поводу того, что я могу делать не так с любым из этих подходов, или третьего варианта, который Я должен попробовать? И есть ли у кого-нибудь информация solid о том, что "не так" с Start-Process -wait?

1 Ответ

2 голосов
/ 14 июля 2020

Если параметр Start-Process -Wait у вас не работает (у меня нет информации о том, почему могут возникать длительные задержки), вы действительно можете работать с экземпляром System.Diagnostics.Process, который Start-Process возвращает, который представляет вновь созданный процесс, при условии, что вы использовали переключатель -PassThru :

# Simple example (Windows): launch Notepad asynchronously,
# and, thanks to -PassThru, return a System.Diagnostics.Process describing 
# the newly created process.
$ps = Start-Process -PassThru Notepad

Если вы хотите использовать Wait-Process для подождите, пока процесс завершится, у вас есть два варианта синтаксиса:

$ps | Wait-Process

или

Wait-Process $ps.ID  # parameter -ID implied

Обратите внимание, что Wait-Process $ps не работает не , потому что он пытается для привязки к параметру -Name, в результате чего $ps.ToString() будет использоваться как (бесполезное) значение.

Однако вы также можете напрямую использовать метод .WaitForExit() типа Process:

$ps.WaitForExit()

После завершения процесса вы можете запросить его свойство .ExitCode, чтобы получить его код выхода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...