Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 启动过程-Autodesk Revit的等待问题_Powershell_Start Process - Fatal编程技术网

Powershell 启动过程-Autodesk Revit的等待问题

Powershell 启动过程-Autodesk Revit的等待问题,powershell,start-process,Powershell,Start Process,我看到一些奇怪的行为与基准,已工作多年。基准是针对Autodesk Revit的,它可以使用日志文件自动执行任务和记录时间。基准测试将读取一系列模块化日志文件的XML文件,这些文件可以按照不同的顺序进行处理,具体取决于要基准测试的Revit功能。因此,Revit使用不同的日志启动,并在每个日志完成时关闭,然后使用下一个日志重新启动。 我一直在这样一个循环中使用启动进程和-wait选项 $exitCode = (Start-Process -FilePath:$executable -argume

我看到一些奇怪的行为与基准,已工作多年。基准是针对Autodesk Revit的,它可以使用日志文件自动执行任务和记录时间。基准测试将读取一系列模块化日志文件的XML文件,这些文件可以按照不同的顺序进行处理,具体取决于要基准测试的Revit功能。因此,Revit使用不同的日志启动,并在每个日志完成时关闭,然后使用下一个日志重新启动。 我一直在这样一个循环中使用
启动进程
-wait
选项

$exitCode = (Start-Process -FilePath:$executable -argumentList:"`"$journalFile`"" -wait -errorAction:stop -PassThru).ExitCode
$processInfo = New-Object System.Diagnostics.ProcessStartInfo
$processInfo.RedirectStandardError = $true
$processInfo.RedirectStandardOutput = $true
$processInfo.UseShellExecute = $false
$process = New-Object System.Diagnostics.Process
最近发生的事情是日志从运行到完成&关闭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]
的参考,如下所示

$exitCode = (Start-Process -FilePath:$executable -argumentList:"`"$journalFile`"" -wait -errorAction:stop -PassThru).ExitCode
$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可能不知道它是如何启动的


有没有人对我使用这两种方法中的任何一种方法可能会犯的错误或我应该尝试的第三种方法有任何建议?还有,是否有人对
启动流程-等待
的“错误”有可靠的信息?

如果
启动流程
-wait
参数对您不起作用(我不知道为什么会发生长时间延迟),假设您使用了
-PassThru
开关,您确实可以使用
启动流程
返回的代表新创建流程的实例:

如果要使用等待进程退出,则有两个语法选项:

$ps | Wait-Process

请注意,
等待进程$ps
不起作用,因为它试图绑定到
-Name
参数,导致
$ps.ToString()
用作(无用)值

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

$ps.WaitForExit()

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

这就是我需要的技巧。是否有任何论据支持或反对
.WaitForExit()
等待进程$ps.ID
?我两个都试过了,似乎都很管用。仍然需要在Windows 7/PS2.0中同时尝试这两种方法,因为一些架构师仍在使用它。@Gordon:这两种方法是可以互换的,不过作为形成我建议的一个一般习惯,就是坚持使用PowerShell本机功能(除非出于性能原因而被迫使用其他方法)。这不是一个现实的问题,但是,由于动态重载解析,如果底层.NET类型引入新的重载,方法调用可能会在PowerShell版本之间无意中更改其行为。至于直接的性能比较:在第一次调用时,
等待过程
调用可能会更快,因为方法调用是JIT编译的-我怀疑这一点在这里很重要。呃,.NET方法不能被信任到不同的版本,这真是一个遗憾。这可能会告诉我在另一个项目上需要做的一些决定,因为出于性能原因,我一直默认使用.NET。我想如果我想依赖.NET,我可能需要转到C#并编译一个EXE。@Gordon:当然,这很少见,但确实发生过;有关突出的示例,请参见的底部部分。如果仔细地应用参数的显式转换以确保传递的是所需的确切类型,则可以防止此类问题。