启动过程中的写入进度 -Wait

Chr*_*ris 4 powershell

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

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

作为进度条,我想添加:

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

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

如果有人有想法...

bri*_*ist 6

您可以为进度条使用线程选项,但我不建议这样做。

相反,放弃-WaitwithStart-Process和 use-PassThru返回一个[System.Diagnostics.Process]object

这样,您可以检查自己终止的进程。

这很重要,原因有二,都与进度条实际上并未跟踪安装进度有关:

  1. 您希望能够在过程完成后立即中止进度条。
  2. 如果碰巧花费的时间超过 10,000 毫秒,您可能希望将进度条重置为 0。

Process对象有一个布尔属性.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
    }
}
Run Code Online (Sandbox Code Playgroud)

变更概要

  • Start-Process现在使用-PassThru代替-Wait并将流程对象分配给$process变量。
  • for循环的迭代器使用$i = ($i + 1) % 100,而不是$i++,所以它不断重置0当它到达100
  • 一个if块检查进程是否已经退出;如果是这样,它会结束进度条,然后break退出循环。

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