Autodesk Revit 的启动进程 - 等待问题
Start-Process -wait issues with 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
的“错误”是什么?
如果 Start-Process
的 -Wait
参数对你不起作用(我不知道为什么会出现长时间延迟),你确实可以使用 System.Diagnostics.Process
实例Start-Process
returns 表示新创建的进程,假设您使用了 -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
属性 以获取其退出代码。
我发现使用多年的基准测试有一些奇怪的行为。基准测试适用于 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
的“错误”是什么?
如果 Start-Process
的 -Wait
参数对你不起作用(我不知道为什么会出现长时间延迟),你确实可以使用 System.Diagnostics.Process
实例Start-Process
returns 表示新创建的进程,假设您使用了 -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
属性 以获取其退出代码。