<# Alan dot Kaplan at VA dot Gov 10/27/2014 .Synopsis Select-PropertiesForm function lets you select properties and other items from an object or array and put them into a second array using a form. .DESCRIPTION Select-PropertiesForm function lets you select properties and other items from an object or array and put them into a second array using a form. It supports multi-select This allows the user to select what properties go into an exported list, and in what order .EXAMPLE #Example: Have user choose information to view from Get-Process $Proc = Get-Process #Call the Function with object as parameter $Selected =Select-PropertiesForm $Proc Get-Process | select -Property $Selected | Out-GridView -Title "Selected Process Info" #> Function Select-PropertiesForm { #Requires -version 3 #Initial code generated by #SAPIEN Technologies PrimalForms (Community Edition) v1.0.10.0 [CmdletBinding()] [OutputType([psObject])] Param ( # InputObject help description [Parameter(Mandatory=$True, Position=0)] $InputObject, # FormTitle help description [Parameter(Mandatory=$False, Position=1)] [string]$FormTitle="Select in order the properties to report, then accept list" ) $inputObject = ($InputObject| gm -MemberType *property).Name | sort #Region Import Assemblies Add-Type -assemblyname System.Windows.Forms Add-Type -assemblyname System.Drawing #EndRegion Import Assemblies #Region Clear Variables $Script:NewList ="" #EndRegion Clear Variables #region Form Objects $SelectForm = New-Object System.Windows.Forms.Form $CancelBtn = New-Object System.Windows.Forms.Button $AcceptBtn = New-Object System.Windows.Forms.Button $MoveLftBtn = New-Object System.Windows.Forms.Button $MoveRtBtn = New-Object System.Windows.Forms.Button $lb_NewList = New-Object System.Windows.Forms.ListBox $lb_OrigList = New-Object System.Windows.Forms.ListBox $InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState #EndRegion Form Objects #---------------------------------------------- #Event Script Blocks #---------------------------------------------- $On_AcceptBtn_Click= { $Script:NewList = @() foreach ($item in $lb_NewList.Items){$Script:NewList += $item} $SelectForm.Close() } # Don't need this, because Cancel action is set in form definition, below # $On_CancelBtn_Click= # Begin by loading data passed to function $On_SelectForm_Load= { foreach($item in $InputObject) {$lb_OrigList.items.add($item)} } #Click the move left button removes from New list and puts back item to the original list $On_MoveLftBtn_Click= { $movelist = @() foreach ($item in $lb_NewList.SelectedItems){$movelist += $item} foreach($item in $movelist){ $lb_NewList.items.remove($item) $lb_OrigList.items.add($item) } } #Click the move right button removes from original list and puts item to the new list $On_MoveRtBtn_Click= { $movelist = @() foreach ($item in $lb_OrigList.SelectedItems){$movelist += $item} foreach($item in $movelist){ $lb_OrigList.items.remove($item) $lb_NewList.items.add($item) } } $OnLoadForm_StateCorrection= {#Sapien says this corrects the initial state of the form to prevent the .Net maximized form issue $SelectForm.WindowState = $InitialFormWindowState } #---------------------------------------------- #region Form Code $SelectForm.CancelButton = $CancelBtn $SysDrawSize = New-Object System.Drawing.Size $SysDrawSize.Height = 378 $SysDrawSize.Width = 632 $SelectForm.ClientSize = $SysDrawSize $SelectForm.DataBindings.DefaultDataSourceUpdateMode = 0 $SelectForm.Name = "SelectForm" $SelectForm.Text = $FormTitle $SelectForm.add_Load($On_SelectForm_Load) #Cancel Button $CancelBtn.DataBindings.DefaultDataSourceUpdateMode = 0 $CancelBtn.DialogResult = 2 $SysDrawPoint = New-Object System.Drawing.Point $SysDrawPoint.X = 255 $SysDrawPoint.Y = 219 $CancelBtn.Location = $SysDrawPoint $CancelBtn.Name = "CancelBtn" $SysDrawSize = New-Object System.Drawing.Size $SysDrawSize.Height = 26 $SysDrawSize.Width = 75 $CancelBtn.Size = $SysDrawSize $CancelBtn.TabIndex = 5 $CancelBtn.Text = "Cancel" $CancelBtn.UseVisualStyleBackColor = $True $CancelBtn.add_Click($On_CancelBtn_Click) $SelectForm.Controls.Add($CancelBtn) #Accept Button $AcceptBtn.DataBindings.DefaultDataSourceUpdateMode = 0 $SysDrawPoint = New-Object System.Drawing.Point $SysDrawPoint.X = 255 $SysDrawPoint.Y = 177 $AcceptBtn.Location = $SysDrawPoint $AcceptBtn.Name = "AcceptBtn" $SysDrawSize = New-Object System.Drawing.Size $SysDrawSize.Height = 23 $SysDrawSize.Width = 75 $AcceptBtn.Size = $SysDrawSize $AcceptBtn.TabIndex = 4 $AcceptBtn.Text = "Accept List" $AcceptBtn.UseVisualStyleBackColor = $True $AcceptBtn.add_Click($On_AcceptBtn_Click) $SelectForm.Controls.Add($AcceptBtn) #Move Left Button $MoveLftBtn.DataBindings.DefaultDataSourceUpdateMode = 0 $SysDrawPoint = New-Object System.Drawing.Point $SysDrawPoint.X = 255 $SysDrawPoint.Y = 111 $MoveLftBtn.Location = $SysDrawPoint $MoveLftBtn.Name = "MoveLftBtn" $SysDrawSize = New-Object System.Drawing.Size $SysDrawSize.Height = 45 $SysDrawSize.Width = 75 $MoveLftBtn.Size = $SysDrawSize $MoveLftBtn.TabIndex = 3 $MoveLftBtn.Text = "<< Move" $MoveLftBtn.UseVisualStyleBackColor = $True $MoveLftBtn.add_Click($On_MoveLftBtn_Click) $SelectForm.Controls.Add($MoveLftBtn) #Move Right Button $MoveRtBtn.DataBindings.DefaultDataSourceUpdateMode = 0 $MoveRtBtn.Enabled = $True $SysDrawPoint = New-Object System.Drawing.Point $SysDrawPoint.X = 255 $SysDrawPoint.Y = 38 $MoveRtBtn.Location = $SysDrawPoint $MoveRtBtn.Name = "MoveRtBtn" $SysDrawSize = New-Object System.Drawing.Size $SysDrawSize.Height = 45 $SysDrawSize.Width = 75 $MoveRtBtn.Size = $SysDrawSize $MoveRtBtn.TabIndex = 2 $MoveRtBtn.Text = "Move >>" $MoveRtBtn.UseVisualStyleBackColor = $True $MoveRtBtn.add_Click($On_MoveRtBtn_Click) $SelectForm.Controls.Add($MoveRtBtn) #Left Panel original data $lb_OrigList.DataBindings.DefaultDataSourceUpdateMode = 0 $lb_OrigList.FormattingEnabled = $True $SysDrawPoint = New-Object System.Drawing.Point $SysDrawPoint.X = 12 $SysDrawPoint.Y = 2 $lb_OrigList.Location = $SysDrawPoint $lb_OrigList.Name = "listBox1" $SysDrawSize = New-Object System.Drawing.Size $SysDrawSize.Height = 355 $SysDrawSize.Width = 235 $lb_OrigList.Size = $SysDrawSize $lb_OrigList.TabIndex = 0 $lb_origList.SelectionMode = "multiExtended" $SelectForm.Controls.Add($lb_OrigList) #Right Panel new data $lb_NewList.DataBindings.DefaultDataSourceUpdateMode = 0 $lb_NewList.FormattingEnabled = $True $SysDrawPoint = New-Object System.Drawing.Point $SysDrawPoint.X = 344 $SysDrawPoint.Y = 2 $lb_NewList.Location = $SysDrawPoint $lb_NewList.Name = "listBox2" $SysDrawSize = New-Object System.Drawing.Size $SysDrawSize.Height = 355 $SysDrawSize.Width = 235 $lb_NewList.Size = $SysDrawSize $lb_NewList.TabIndex = 1 $lb_NewList.SelectionMode = "multiExtended" $SelectForm.Controls.Add($lb_NewList) #EndRegion Form Code #Save the initial state of the form $InitialFormWindowState = $SelectForm.WindowState #Init the OnLoad event to correct the initial state of the form $SelectForm.add_Load($OnLoadForm_StateCorrection) #Show the Form $SelectForm.ShowDialog()| Out-Null #Return the value from the function if ($Script:NewList[0].Count -eq 0){ Write-Warning "Nothing selected" Exit }ELSE{ $Script:NewList Return } } #End Function #Example: Have user choose fields from Get-User $obj = get-aduser -Filter ('sn -eq "Smith"') -properties * #Call the Function with object as parameter $Selected =Select-PropertiesForm $obj $obj | select -Property $Selected | Out-GridView -Title "User Info" #$obj = Get-process #$Selected = Select-PropertiesForm $obj #$obj | select -Property $Selected | #Out-GridView -Title "User Info"