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

2024-05-20

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

$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 with Start-Process,并使用-PassThru返回一个[System.Diagnostics.Process] object https://msdn.microsoft.com/en-us/library/system.diagnostics.process%28v=vs.110%29.aspx.

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

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

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

The Process对象有一个布尔属性称为.HasExited https://msdn.microsoft.com/en-us/library/system.diagnostics.process.hasexited(v=vs.110).aspx您可以将其用于此目的。

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

$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多变的。
  • The for循环的迭代器使用$i = ($i + 1) % 100代替$i++,使其不断重置为0当它达到100.
  • An if块检查进程是否已退出;如果是这样,它会结束进度条,然后break脱离循环。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

启动过程中的写入进度 - 等待 的相关文章

随机推荐