Powershell 表单进度条未正确更新

标签 powershell

我有一段显示进度的 PowerShell 代码。进度条未正确更新。它从 0% 开始,但应该从 17% 开始。另外,完成后,进度条并未完成。因此布局并不是 100% 准确。

The progress bar has not the correct length.

代码有什么问题?

# =============================================================================================================================================
# Add assemblies.
# =============================================================================================================================================

  Add-Type -AssemblyName System.Windows.Forms

# =============================================================================================================================================
# Define objects
# =============================================================================================================================================

  $frmTest                        = New-Object 'System.Windows.Forms.Form'
  $pgbProgress                    = New-Object 'System.Windows.Forms.ProgressBar'
  $lblPackage                     = New-Object 'System.Windows.Forms.Label'

# =============================================================================================================================================
# Form and show the progressbar. Close with the 'X' at the upper right corner.
# =============================================================================================================================================

  $frmTest.Controls.Add($pgbProgress)
  $frmTest.Controls.Add($lblPackage)
  $frmTest.AutoScaleDimensions    = New-Object System.Drawing.SizeF(6, 13)
  $frmTest.AutoScaleMode          = 'Font'
  $frmTest.ClientSize             = New-Object System.Drawing.Size(528, 220)
  $frmTest.Name = 'frmTest'
  $frmTest.Text = 'Form'
  $frmTest.add_Shown({
                      $arrPackages  = @("IrfanView","7Zip","WinZIP","Office","PhotoShop","PaintShop")
                      $numPackages  = $arrPackages.Count
                      $numCounter   = 1
                      ForEach($Package in $arrPackages)
                       {
                        [int]$Percentage    = ($numCounter / $numPackages) * 100
                        $lblPackage.Text    = "Processing: $Package   ($numCounter of $numPackages packages - $Percentage%"
                        $pgbProgress.Value  = $Percentage
                        $pgbProgress.PerformStep()
                        Sleep -Seconds 4
                        $numCounter++
                       }
                      Sleep -Seconds 5
                      [void]$frmTest.Close()
                      [void]$frmTest.Dispose()
                     })

  $pgbProgress.Location           = New-Object System.Drawing.Point(13, 165)
  $pgbProgress.Name               = 'pgbProgress'
  $pgbProgress.Size               = New-Object System.Drawing.Size(503, 43)
  $pgbProgress.Style              = 'Continuous'
  
  $lblPackage.AutoSize            = $True
  $lblPackage.Location            = New-Object System.Drawing.Point(13, 137)
  $lblPackage.Name                = 'lblPackage'
  $lblPackage.Size                = New-Object System.Drawing.Size(38, 13)
  $lblPackage.Text                = 'Processing all the packages...'

  [void]$frmTest.ShowDialog()

感谢任何帮助。

谨致问候, 威廉·简

最佳答案

好吧,我认为 Windows 窗体有点不稳定,但尽管我上面有评论,如果您不设置该值,而是设置 Step ,它似乎更可靠。相反,因为您每次都将条形移动一个设定的数字。然后使用 PerformStep() 来增加条。两者同时进行,即设置值和使用 PerformStep() 是令人困惑的事情。

像这样:


Add-Type -AssemblyName System.Windows.Forms

$frmTest = New-Object 'System.Windows.Forms.Form'
$pgbProgress = New-Object 'System.Windows.Forms.ProgressBar'
$lblPackage = New-Object 'System.Windows.Forms.Label'

$frmTest.Controls.Add($pgbProgress)
$frmTest.Controls.Add($lblPackage)
$frmTest.AutoScaleDimensions = New-Object System.Drawing.SizeF(6, 13)
$frmTest.AutoScaleMode = 'Font'
$frmTest.ClientSize = New-Object System.Drawing.Size(528, 220)
$frmTest.Name = 'frmTest'
$frmTest.Text = 'Form'
$frmTest.add_Shown( {
        $arrPackages = @("IrfanView", "7Zip", "WinZIP", "Office", "PhotoShop", "PaintShop")
        $numPackages = $arrPackages.Count
        $numCounter = 1
        # Set the step value.
        $pgbProgress.Step = ($numCounter / $numPackages) * 100
        ForEach ($Package in $arrPackages) {
            [int]$Percentage = ($numCounter / $numPackages) * 100
            $lblPackage.Text = "Processing: $Package   ($numCounter of $numPackages packages - $Percentage%"
            $pgbProgress.PerformStep()
            Sleep -Seconds 2
            $numCounter++
        }
        Sleep -Seconds 2
        [void]$frmTest.Close()
        [void]$frmTest.Dispose()
    })

$pgbProgress.Location = New-Object System.Drawing.Point(13, 165)
$pgbProgress.Name = 'pgbProgress'
$pgbProgress.Size = New-Object System.Drawing.Size(503, 43)
$pgbProgress.Style = 'Continuous'
  
$lblPackage.AutoSize = $True
$lblPackage.Location = New-Object System.Drawing.Point(13, 137)
$lblPackage.Name = 'lblPackage'
$lblPackage.Size = New-Object System.Drawing.Size(38, 13)
$lblPackage.Text = 'Processing all the packages...'

[void]$frmTest.ShowDialog()

关于Powershell 表单进度条未正确更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67555332/

相关文章:

mysql - 如何诊断 Entity Framework 迁移错误?

powershell - 只读取文件中的一部分

Powershell 从 ForEach 循环导出到 CSV

xml - 使用Powershell检索xml值

powershell - 在自动构建过程中使用脚本

powershell - Set-AzureDeployment 忽略相对路径

python - virtualenv 没有激活虚拟环境

java - Powershell:使用 Process 对象捕获标准输出和错误

powershell - 清除PowerShell Sharepoint缓存?

PowerShell 生成一个后台进程以保持事件状态