Powershell 启动过程中写入进度-等待

Powershell 启动过程中写入进度-等待,powershell,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" -PercentComple

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

$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;
}    
但是我找不到在安装程序运行时运行进度条的方法


如果有人有想法…

你可以在进度条上随意使用线程选项,但我不推荐这样做

相反,使用
启动进程
放弃
-Wait
,并使用
-PassThru
返回

这样,您就可以检查进程是否已自行终止

这一点很重要,有两个原因,这两个原因都与进度栏没有实际跟踪安装进度有关:

  • 您希望能够在进程完成后立即中止进度条
  • 如果需要的时间超过10000毫秒,可能需要将进度条重置为0
  • 进程
    对象具有可用于此目的的属性

    考虑到这些,我会这样做:

    $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++
      ,因此当达到
      100
      时,它会一直重置为
      0
    • if
      块检查进程是否已退出;如果是这样,它将结束进度条,然后
      中断
      s退出循环

    请注意:for的
    循环现在是一个无限循环,只有在进程退出时才会中断。如果进程停滞,循环也会停滞。如果愿意,您可以分别为操作计时并处理超时。

    太棒了!比预期的要多!谢谢你提供的细节。