如何让PowerShell等待Invoke-Item完成?

12 浏览
0 Comments

如何让PowerShell等待Invoke-Item完成?

如何让PowerShell等待Invoke-Item调用完成?我正在调用一个非可执行项,因此需要使用Invoke-Item来打开它。

0
0 Comments

问题的原因是,PowerShell在执行Invoke-Item命令时不会等待其完成,而是立即继续执行下一条命令。这可能会导致问题,特别是在需要确保Invoke-Item完成后再执行其他操作的情况下。

为了解决这个问题,可以使用管道将命令输出到Out-Null。这将确保命令执行完毕后,PowerShell才会继续执行下一条命令。

以下是一个示例:

Invoke-Expression ... | Out-Null

另一个示例是:

myprogram.exe | Out-Null

这个解决方法可以在stackoverflow.com/a/7908022/217593找到。

0
0 Comments

问题出现的原因是PowerShell在执行Invoke-Item命令时不会等待其完成,导致后续的代码可能会在Invoke-Item执行之前执行。

解决方法是使用Start-Process -wait命令来替代Invoke-Item命令。例如,使用Start-Process -wait c:\image.jpg来打开一个图片文件,并等待其打开完成。这样可以确保在执行后续代码之前,Start-Process命令已经完成。

0
0 Comments

如何让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方法等待进程执行完成。

0