# encoding: ascii # api: powershell # title: # description: GUI Replacement for PowerShell’s Write-Progress command # version: 1.0 # type: function # license: CC0 # function: Write-ProgressForm # x-poshcode-id: 4018 # x-archived: 2015-08-09T06:20:20 # # Uses same named parameters for drop-in replacement # CAVEATS: You can’t close the Form by clicking on it, must call Write-ProgressForm -Completed # Code below is a working sample # function Write-ProgressForm { <# .SYNOPSIS Write-ProgressForm V1.0 GUI Replacement for PowerShell's Write-Progress command .DESCRIPTION GUI Replacement for PowerShell's Write-Progress command Uses same named parameters for drop-in replacement CAVEATS: You can't close the Form by clicking on it, must call Write-ProgressForm -Completed Therefore decided to hide Close button (why tease people?) .INPUTS Same as Write-Progress command BONUS: -ICOpath -FormTitle (Only needs to be mentioned when 1st called then it sticks around) .OUTPUTS Nothing but a GUI .NOTES Uses Global variables extensively License: GPL v3.0 or greater / BSD (Latest version) Form Code Generated By: SAPIEN Technologies PrimalForms (Community Edition) v1.0.10.0 Generated On: 30/01/2013 12:38 PM Generated By: Denis St-Pierre, Ottawa, Canada #> param( #parameters with default values assigned [String]$Activity="Activity", [String]$CurrentOperation="CurrentOperation", [String]$status="Status", [Int]$PercentComplete=0, [switch]$Completed=$false, [int]$FontSize = 10, [String]$ICOpath="", #yes, you can use your *OWN* icon file in the form [String]$FormTitle="" ) $HideUselessCloseButton=$true #Change to false if you can fix it, pls $UselessAutoSize=$false #Useless because it doesn't work as expected #If WriteProgressForm variable exists, use it. If ( Get-Variable -Name WriteProgressForm -Scope Global -ErrorAction SilentlyContinue ) { If ( $Completed){ #If asked to close, do it $progressBar1.Value=100 $StatusLabel.Text = "Complete" Start-Sleep -Seconds 1 $WriteProgressForm.close() Return } else { #otherwise, Update it $progressBar1.Value = $PercentComplete #To update Progress bar position $ActivityLabel.Text = "$Activity" $CurrentOperationLabel.Text = "$CurrentOperation" $StatusLabel.Text = "$status" Return } } #region Import the Assemblies [reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null [reflection.assembly]::loadwithpartialname("System.Drawing") | Out-Null #endregion #region Generated Form Objects $global:WriteProgressForm = New-Object System.Windows.Forms.Form $global:StatusLabel = New-Object System.Windows.Forms.Label $CloseButton = New-Object System.Windows.Forms.Button $global:progressBar1 = New-Object System.Windows.Forms.ProgressBar $global:CurrentOperationLabel = New-Object System.Windows.Forms.Label $global:ActivityLabel = New-Object System.Windows.Forms.Label $InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState #endregion Generated Form Objects #---------------------------------------------- #Generated Event Script Blocks #---------------------------------------------- #Provide Custom Code for events specified in PrimalForms. # $WriteProgressForm.close()= # { #TODO: Place custom script here # } $CloseButton_OnClick= { #TODO: Place custom script here } $OnLoadForm_StateCorrection= {#Correct the initial state of the form to prevent the .Net maximized form issue $WriteProgressForm.WindowState = $InitialFormWindowState } #---------------------------------------------- #region Generated Form Code $WriteProgressForm.AccessibleDescription = "WriteProgressFormDesc" $WriteProgressForm.AccessibleName = "WriteProgressForm" $WriteProgressForm.AccessibleRole = 48 $WriteProgressForm.AutoSize = $true #works on forms, labels not so much $WriteProgressForm.AutoSizeMode = 0 $System_Drawing_Size = New-Object System.Drawing.Size # $System_Drawing_Size.Height = 170 # $System_Drawing_Size.Width = 505 # $WriteProgressForm.ClientSize = $System_Drawing_Size $WriteProgressForm.DataBindings.DefaultDataSourceUpdateMode = 0 $WriteProgressForm.StartPosition = 1 #Center of the Screen #add Icon to dialog, if possible If ( ($ICOpath -ne "") -and (Test-Path "$ICOpath") ) { Try { #If the ICO file is NFG, ignore and move on $WriteProgressForm.Icon = [System.Drawing.Icon]::ExtractAssociatedIcon("$ICOpath") } catch { } #use default ICO } $WriteProgressForm.Name = "WriteProgressForm" $WriteProgressForm.Text = "$FormTitle" # $WriteProgressForm.add_FormClosing($WriteProgressForm.close()) #failed attempt to make CloseButton work w/o PS code # ** $StatusLabel $StatusLabel.DataBindings.DefaultDataSourceUpdateMode = 0 $System_Drawing_Point = New-Object System.Drawing.Point $System_Drawing_Point.X = 15 $System_Drawing_Point.Y = 33 $StatusLabel.Location = $System_Drawing_Point $System_Drawing_Size = New-Object System.Drawing.Size $System_Drawing_Size.Height = 20 $System_Drawing_Size.Width = 475 $StatusLabel.MinimumSize = $System_Drawing_Size $StatusLabel.AutoSize = $UselessAutoSize $StatusLabel.Name = "StatusLabel" $System_Windows_Forms_Padding = New-Object System.Windows.Forms.Padding $System_Windows_Forms_Padding.All = 1 $System_Windows_Forms_Padding.Bottom = 1 $System_Windows_Forms_Padding.Left = 1 $System_Windows_Forms_Padding.Right = 1 $System_Windows_Forms_Padding.Top = 1 $StatusLabel.Padding = $System_Windows_Forms_Padding # $System_Drawing_Size = New-Object System.Drawing.Size # $System_Drawing_Size.Height = 20 # $System_Drawing_Size.Width = 475 # $StatusLabel.Size = $System_Drawing_Size $StatusLabel.TabIndex = 4 $StatusLabel.Text = "$status" $WriteProgressForm.Controls.Add($StatusLabel) # ** $CloseButton $CloseButton.DataBindings.DefaultDataSourceUpdateMode = 0 $System_Drawing_Point = New-Object System.Drawing.Point $System_Drawing_Point.X = 400 $System_Drawing_Point.Y = 134 $CloseButton.Location = $System_Drawing_Point $CloseButton.Name = "CloseButton" $System_Drawing_Size = New-Object System.Drawing.Size $System_Drawing_Size.Height = 25 $System_Drawing_Size.Width = 90 $CloseButton.Size = $System_Drawing_Size $CloseButton.TabIndex = 3 $CloseButton.Text = "Close" $CloseButton.UseVisualStyleBackColor = $True $CloseButton.add_Click($CloseButton_OnClick) # $CloseButton.add_MouseClick($WriteProgressForm.close()) #failed attempt #2 to make CloseButton work w/o PS code If ($HideUselessCloseButton) { #dont add button to form } else { $WriteProgressForm.Controls.Add($CloseButton) } # ** $progressBar1 $progressBar1.DataBindings.DefaultDataSourceUpdateMode = 0 $System_Drawing_Point = New-Object System.Drawing.Point $System_Drawing_Point.X = 10 $System_Drawing_Point.Y = 57 $progressBar1.Location = $System_Drawing_Point $System_Windows_Forms_Padding = New-Object System.Windows.Forms.Padding $System_Windows_Forms_Padding.All = 5 $System_Windows_Forms_Padding.Bottom = 5 $System_Windows_Forms_Padding.Left = 5 $System_Windows_Forms_Padding.Right = 5 $System_Windows_Forms_Padding.Top = 5 $progressBar1.Margin = $System_Windows_Forms_Padding $System_Drawing_Size = New-Object System.Drawing.Size $System_Drawing_Size.Height = 30 $System_Drawing_Size.Width = 480 $progressBar1.MinimumSize = $System_Drawing_Size $progressBar1.AutoSize = $UselessAutoSize #doesn't work, stays the same size $progressBar1.Name = "progressBar1" # $System_Drawing_Size = New-Object System.Drawing.Size # $System_Drawing_Size.Height = 30 # $System_Drawing_Size.Width = 480 # $progressBar1.Size = $System_Drawing_Size $progressBar1.Step = 1 $progressBar1.Style = 1 $progressBar1.TabIndex = 2 $progressBar1.Value = $PercentComplete #Progress bar position $WriteProgressForm.Controls.Add($progressBar1) # ** $CurrentOperationLabel $CurrentOperationLabel.AccessibleDescription = "CurrentOperationDesc" $CurrentOperationLabel.AccessibleName = "CurrentOperation" $CurrentOperationLabel.AccessibleRole = 0 $CurrentOperationLabel.CausesValidation = $False $CurrentOperationLabel.DataBindings.DefaultDataSourceUpdateMode = 0 $System_Drawing_Point = New-Object System.Drawing.Point $System_Drawing_Point.X = 15 $System_Drawing_Point.Y = 100 $CurrentOperationLabel.Location = $System_Drawing_Point $System_Windows_Forms_Padding = New-Object System.Windows.Forms.Padding $System_Windows_Forms_Padding.All = 1 $System_Windows_Forms_Padding.Bottom = 1 $System_Windows_Forms_Padding.Left = 1 $System_Windows_Forms_Padding.Right = 1 $System_Windows_Forms_Padding.Top = 1 $CurrentOperationLabel.Margin = $System_Windows_Forms_Padding $System_Drawing_Size = New-Object System.Drawing.Size $System_Drawing_Size.Height = 20 $System_Drawing_Size.Width = 475 $CurrentOperationLabel.MinimumSize = $System_Drawing_Size $CurrentOperationLabel.AutoSize = $UselessAutoSize $CurrentOperationLabel.Name = "CurrentOperationLabel" $System_Windows_Forms_Padding = New-Object System.Windows.Forms.Padding $System_Windows_Forms_Padding.All = 1 $System_Windows_Forms_Padding.Bottom = 1 $System_Windows_Forms_Padding.Left = 1 $System_Windows_Forms_Padding.Right = 1 $System_Windows_Forms_Padding.Top = 1 $CurrentOperationLabel.Padding = $System_Windows_Forms_Padding # $System_Drawing_Size = New-Object System.Drawing.Size # $System_Drawing_Size.Height = 20 # $System_Drawing_Size.Width = 475 # $CurrentOperationLabel.Size = $System_Drawing_Size $CurrentOperationLabel.TabIndex = 1 $CurrentOperationLabel.Text = "$CurrentOperation" $WriteProgressForm.Controls.Add($CurrentOperationLabel) # ** $ActivityLabel # $ActivityLabel.CausesValidation = $False $ActivityLabel.DataBindings.DefaultDataSourceUpdateMode = 0 $System_Drawing_Point = New-Object System.Drawing.Point $System_Drawing_Point.X = 10 $System_Drawing_Point.Y = 10 $ActivityLabel.Location = $System_Drawing_Point $System_Windows_Forms_Padding = New-Object System.Windows.Forms.Padding $System_Windows_Forms_Padding.All = 1 $System_Windows_Forms_Padding.Bottom = 1 $System_Windows_Forms_Padding.Left = 1 $System_Windows_Forms_Padding.Right = 1 $System_Windows_Forms_Padding.Top = 1 $ActivityLabel.Margin = $System_Windows_Forms_Padding $System_Drawing_Size = New-Object System.Drawing.Size $System_Drawing_Size.Height = 20 $System_Drawing_Size.Width = 480 $ActivityLabel.MinimumSize = $System_Drawing_Size $ActivityLabel.Name = "ActivityLabel" $System_Windows_Forms_Padding = New-Object System.Windows.Forms.Padding $System_Windows_Forms_Padding.All = 1 $System_Windows_Forms_Padding.Bottom = 1 $System_Windows_Forms_Padding.Left = 1 $System_Windows_Forms_Padding.Right = 1 $System_Windows_Forms_Padding.Top = 1 $ActivityLabel.Padding = $System_Windows_Forms_Padding $ActivityLabel.AutoSize = $UselessAutoSize # $System_Drawing_Size = New-Object System.Drawing.Size # $System_Drawing_Size.Height = 20 # $System_Drawing_Size.Width = 480 # $ActivityLabel.Size = $System_Drawing_Size $ActivityLabel.TabIndex = 0 $ActivityLabel.Font = New-Object System.Drawing.Font("Microsoft Sans Serif",$FontSize,1,3,1) $ActivityLabel.Text = "$Activity" $WriteProgressForm.Controls.Add($ActivityLabel) #endregion Generated Form Code #Save the initial state of the form $InitialFormWindowState = $WriteProgressForm.WindowState #Init the OnLoad event to correct the initial state of the form $WriteProgressForm.add_Load($OnLoadForm_StateCorrection) #Show the Form # $WriteProgressForm.ShowDialog()| Out-Null #ShowDialog waits until it is closed $WriteProgressForm.Show() #show form and keep on going $WriteProgressForm.activate() #Make sure its on top Start-sleep -Milliseconds 500 #was needed to give time for form to fully draw itself } #End Function #Clean up global WriteProgressForm variables before try { $WriteProgressForm.close() Remove-Variable StatusLabel | Out-Null Remove-Variable CurrentOperationLabel | Out-Null Remove-Variable progressBar1 | Out-Null Remove-Variable ActivityLabel | Out-Null Remove-Variable WriteProgressForm } catch { #go on } $ScopeNum=0 $Scope=0 $TotalNumScopes=100 #Foreach ($DHCPScope in $ObjDHCPscopes){ for ($PCcomplete=1; $PCcomplete -lt 100; $PCcomplete++) { $ScopeName="ScopeName" $Scope=$Scope+1 #increment $CurrentOperation="*CurOp*Getting Leases from scope $ScopeName" $Status="*Status*$PCcomplete% complete. ($Scope of $TotalNumScopes)" # Write-Progress -Activity "*Act*Building list from DHCP server ..." -status $status -PercentComplete $PCcomplete -CurrentOperation "$CurrentOperation" Write-ProgressForm -Activity "*Act*Building list from DHCP server ... Building list from DHCP server... Building list from DHCP server ..." -status $status -PercentComplete $PCcomplete -CurrentOperation "$CurrentOperation" Start-sleep -Milliseconds 050 } $PCcomplete=100 $CurrentOperation="complete" #Write-Progress -Activity "Building list from DHCP server ..." -PercentComplete $PCcomplete -CurrentOperation "$CurrentOperation" -Status "$PCcomplete% complete." Write-ProgressForm -Activity "Building list from DHCP server ..." -PercentComplete $PCcomplete -CurrentOperation "$CurrentOperation" -Status "$PCcomplete% complete." Start-sleep -seconds 1 #Write-Progress -Activity "Complete" -Completed -Status "Complete" Write-ProgressForm -Activity "Complete" -Completed -Status "Complete"