WPF进度条PowerShell

时间:2016-02-18 19:29:14

标签: c# wpf powershell

我一直试图在我的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()

})

当我在调用快速测试功能之前尝试放入一个,它会一直加载然后启动测试,如果我把它放进去之后它会进行测试然后启动进度条。我只想要一个简单的进度条来完成这个脚本。任何帮助或见解将不胜感激,谢谢!

1 个答案:

答案 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表单在代码的上下文中是如何工作的。如果您希望我进一步帮助您,您需要向我提供更多细节。 :)