powershell - 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
's-Wait
参数对您不起作用(我不知道为什么可能会发生长时间延迟),您确实可以使用返回代表新创建进程的System.Diagnostics.Process
实例,假设您使用了switch: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()
但是,您也可以直接使用该Process
类型的.WaitForExit()
方法:
$ps.WaitForExit()
进程终止后,您可以查询其.ExitCode
属性以获取其退出代码。
推荐阅读
- c++ - MFC MDI 属性页单选按钮在功能 1 的一个页面上工作,功能 2 的另一页面上的按钮不触发
- ios - 在 Xcode 12.3 上创建的 .ipa 文件具有不同的大小
- postgresql - airflow.exceptions.AirflowConfigException:错误:不能使用 sqlite 版本 < 3.15.0
- asp.net - 尝试使用 AddPasswordAsync 更新我的用户密码,但密码始终保留为空
- c# - MongoDB 使用 C# 驱动程序更新嵌套数组
- git - 如何为数据工厂而不是 Git 配置 Azure Devops 帐户?
- c++ - 如何防止大括号初始化器在函数重载中被解释为整数?
- linux - htaccess 错误配置 500
- sql - 如何使用通过 SQL 视图从 GeoServer 请求的 WMS 图层仅显示 5 个要素?
- javascript - 解析 JavaScript 代理对象中的承诺