首页 > 解决方案 > Autodesk Revit 的启动过程等待问题

问题描述

我看到一个已经运行多年的基准有一些奇怪的行为。该基准适用于 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

标签: powershellstart-process

解决方案


如果Start-Process's-Wait参数对您不起作用(我不知道为什么可能会发生长时间延迟),您确实可以使用返回代表新创建进程的System.Diagnostics.Process实例,假设您使用了switchStart-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()

但是,您也可以直接使用该Process类型的.WaitForExit()方法:

$ps.WaitForExit()

进程终止后,您可以查询其.ExitCode属性以获取其退出代码。


推荐阅读