如何让PowerShell等待Invoke-Item完成?
问题的原因是,PowerShell在执行Invoke-Item命令时不会等待其完成,而是立即继续执行下一条命令。这可能会导致问题,特别是在需要确保Invoke-Item完成后再执行其他操作的情况下。
为了解决这个问题,可以使用管道将命令输出到Out-Null。这将确保命令执行完毕后,PowerShell才会继续执行下一条命令。
以下是一个示例:
Invoke-Expression ... | Out-Null
另一个示例是:
myprogram.exe | Out-Null
这个解决方法可以在stackoverflow.com/a/7908022/217593找到。
如何让PowerShell等待Invoke-Item命令执行完成?
很不幸的是,直接使用Invoke-Item命令无法实现等待功能。这个命令没有返回值,并且没有任何选项可以用来等待。
目前最好的选择是定义一个自己的函数,将Process API封装起来,代码如下:
function Invoke-Command() { param ( [string]$program = $(throw "Please specify a program" ), [string]$argumentString = "", [switch]$waitForExit ) $psi = new-object "Diagnostics.ProcessStartInfo" $psi.FileName = $program $psi.Arguments = $argumentString $proc = [Diagnostics.Process]::Start($psi) if ( $waitForExit ) { $proc.WaitForExit(); } }
这个自定义函数可以接受三个参数:程序名称(必须指定)、参数字符串和一个开关参数waitForExit(可选)。它使用ProcessStartInfo对象来设置启动进程的相关信息,然后使用Process类的Start方法启动进程。如果waitForExit参数为真,则使用WaitForExit方法等待进程执行完成。