在Start-process -Wait期间写入进度

时间:2018-03-17 22:50:55

标签: powershell

我尝试在安装过程中创建安装脚本并显示进度条。

$localfolder= (Get-Location).path
start-process -FilePath "$localfolder\Installer.exe" -ArgumentList "/silent /accepteula" -Wait

作为我要添加的进度条:

for($i = 0; $i -le 100; $i++)
{
Write-Progress -Activity "Installer" -PercentComplete $i -Status "Installing";
Sleep -Milliseconds 100;
}    

但是在安装程序运行时我无法找到运行进度条的方法。

如果有人有想法......

1 个答案:

答案 0 :(得分:4)

你可以使用线程选项来处理你的进度条,但我不推荐它。

相反,使用-Wait放弃Start-Process,并使用-PassThru返回[System.Diagnostics.Process] object

有了这个,你可以检查你自己已经终止的过程。

这有两个重要原因,两个原因都与您的进度条实际上并未跟踪安装进度有关:

  1. 您希望能够在流程完成后立即中止进度条。
  2. 如果进度条花费的时间超过10,000毫秒,您可能希望将进度条重置为0.
  3. Process对象有a boolean property called .HasExited,您可以将其用于此目的。

    考虑到所有这些,我会做这样的事情:

    $localfolder= (Get-Location).path
    $process = Start-Process -FilePath "$localfolder\Installer.exe" -ArgumentList "/silent /accepteula" -PassThru
    
    for($i = 0; $i -le 100; $i = ($i + 1) % 100)
    {
        Write-Progress -Activity "Installer" -PercentComplete $i -Status "Installing"
        Start-Sleep -Milliseconds 100
        if ($process.HasExited) {
            Write-Progress -Activity "Installer" -Completed
            break
        }
    }
    

    变更摘要

    • Start-Process现在使用-PassThru代替-Wait,并将流程对象分配给$process变量。
    • for循环迭代器使用$i = ($i + 1) % 100代替$i++,以便在0时保持重置为100。< / LI>
    • if块检查进程是否已退出;如果是这样,它会结束进度条,然后break退出循环。

    轻微警告:for循环现在是一个无限循环,只有在进程退出时才会中断。如果进程卡住,循环也是如此。如果您愿意,可以单独计时操作并处理超时。