我有一段显示进度的 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/