我一直试图在我的PowerShell脚本中使用WPF进度条一段时间,但我无法弄明白。我尝试了13种不同的方法,但无济于事。这是我的代码:
$WPFRunQuick_Button.Add_Click({
<# Add-Type -AssemblyName System.Windows.Forms
$Form.Text = "Processing"
$Label = New-Object System.Windows.Forms.Label
$Font = New-Object System.Drawing.Font("Times New Roman",16,[System.Drawing.FontStyle]::Bold)
$form.Font = $Font
$Form.Controls.Add($Label)
$Label.Text = "You have run the quick test, please be patient as it runs."
$Label.AutoSize = $True
$form.autosize = $true
$form.AutoScroll = $true
$form.autosizemode = "GrowAndShrink"
$Form.MinimizeBox = $False
$Form.MaximizeBox = $False
$Form.SizeGripStyle = "Hide"
$form.startposition = "CenterScreen"
$Form.Visible = $True
$Form.Update() #>
$max = 100
For($i = 1; $i -le $max; $i++){
Write-progress -Activity “Device Check” -Status “Testing, please wait.” `
-percentcomplete ($i / $max*100) -id 1
sleep 1
}
# Quick Test Run Function
Quick_Test_Run
# Prompt to send logs to associate support
$a = new-object -comobject wscript.shell
$intAnswer = $a.popup("Do you want to send these results?", 0,"Results",4)
if ($intAnswer -eq 6) {
$a.popup("Results Sent")
# Create email
$EmailSubject = "Tasa Test"
$EmailTo = "usupportlogs@test.com"
$EmailBody = [IO.File]::ReadAllText("C:\Temp\PMCS_TicketLogs.log")
# Send email to usupportlogs inbox
Send-MailMessage -From "PMCS_No_Reply@test.com" -To $EmailTo -subject $EmailSubject -Body $EmailBody -SmtpServer "SMTPRR.Cerner.Com"
} else {
$a.popup("Sending Cancelled")
}
$Form.Close()
})
当我在调用快速测试功能之前尝试放入一个,它会一直加载然后启动测试,如果我把它放进去之后它会进行测试然后启动进度条。我只想要一个简单的进度条来完成这个脚本。任何帮助或见解将不胜感激,谢谢!
答案 0 :(得分:0)
在我最近创建的脚本中,我的GUI应用程序将通过迭代用户提交的IP地址列表(在我的脚本中命名为System.Windows.Forms.TextBox
$boxIpInput
来检查公司产品中一系列计算机的可用性。 1}})并对每个语句执行Test-Connection
条件语句。为了让用户能够看到脚本在ping测试中取得了哪些进展,我使用System.Windows.Forms.ProgressBar
来传达脚本的进度;我通过谷歌搜索“Powershell Forms Progress Bar”并在this链接上发现了这一点。
要创建ProgressBar
对象,我使用了以下代码;
$barPingProgress= New-Object System.Windows.Forms.ProgressBar
$barPingProgress.Size= New-Object System.Drawing.Size(274,20);
$barPingProgress.Location= New-Object System.Drawing.Size(8,440);
$barPingProgress.Style= 'Continuous'
$barPingProgress.Value= 0
$objForm.Controls.Add($barKioskPingProgress);
单击$btnRunIpCheck
按钮执行ping测试后,我使用$boxIpInput
的输入并将其传送到ForEach-Object
循环以逐步增加进度条的计数类似于Quick_Test_Run函数之前的For循环(为了简洁起见,我从下面的代码段中删除了所有不相关的代码);
//other button initialisation code (removed)
...
$btnRunIpCheck.Add_Click({
//some code to validate entries (removed)
...
$arrTmpIpAddresses= $boxIpInput.Text.Split(" `n",[System.StringSplitOptions]::RemoveEmptyEntries)
//some code to check size of list and warn users of the time it would take (removed)
...
$arrTmpIpAddresses | ForEach-Object {
$intOrderCount++
[int]$tmpProgNum= ($intOrderCount/$arrTmpIpAddresses.Count) * 100
$barPingProgress.Value= $tmpProgNum
//ping test code (removed)
}
}
}
就个人而言,我建议您使用System.Windows.Forms.ProgressBar
对象而不是目前使用的Write-Progress
方法;对于代码,您可以将ProgressBar对象添加为Add_Click
事件的一部分或在生成主$ Form对象时创建它,然后开始值增量Add_Click
活动期间。
为了进一步帮助你,我需要了解你在计算进度的重要性 - 我无法真正看到你所反对的东西(除了“设备检查”部分)所以我不太愿意结合一个示例,说明ProgressBar表单在代码的上下文中是如何工作的。如果您希望我进一步帮助您,您需要向我提供更多细节。 :)