public/Invoke-ObjectEditor.ps1
<#
.SYNOPSIS POC Function that lets you edit properties of an object .DESCRIPTION Builds UI for selected properties (infers control type from property type). Very limited functionality Only properties with types that the function can infer will have UI generated for them. .PARAMETER inputobject The object that has properties you want to edit .PARAMETER Property The properties you want to edit (wildcards are allowed) .PARAMETER LabelMap A hashtable with items of the form PropertyName='Desired label'. If the property has UI generated it will use this text instead of the property name. .PARAMETER InPlace If true, the function sets the properties to the new values on the existing object and outputs nothing. If false, the function outputs an object with the "Edited" properties. .EXAMPLE $a=[PSCustomObject]@{Prop1='A';Prop2=150} $a | Invoke-ObjectEditor -property Prop1, Prop2 .NOTES General notes #> function Invoke-ObjectEditor { [CmdletBinding()] Param([Parameter(ValueFromPipeline = $true)]$inputobject, [string[]]$Property, [hashtable]$LabelMap = @{}, [switch]$InPlace) $Controls = $( foreach ($item in $inputObject | get-member -name $property -MemberType Properties) { $value = $inputobject.$($item.Name) switch ($value.GetType()) { 'Int32' { TextBox -Name $item.Name -InitialValue $value } 'String' { TextBox -Name $item.Name -InitialValue $value } 'bool' { CheckBox -Name $Item.Name -InitialValue $value } 'DateTime' { TextBox -Name $item.Name -InitialValue $value } } } ) $out = Dialog {$controls} -LabelMap $labelMap if ($InPlace) { foreach ($item in $out | get-member $Property -MemberType Properties) { $inputobject.$($item.Name) = $out.$($item.Name) } } else { $out } } New-Alias -Name Edit-Object -Value Invoke-ObjectEditor |