Private/Update-AtwsObjectsWithParameters.ps1
<#
.COPYRIGHT Copyright (c) ECIT Solutions AS. All rights reserved. Licensed under the MIT license. See https://github.com/ecitsolutions/Autotask/blob/master/LICENSE.md for license information. #> Function Update-AtwsObjectsWithParameters { <# .SYNOPSIS This function updates an array of objects with the parameter set of a Set- or New-function. .DESCRIPTION This function updates an array of objects with the parameters passed to a Set- or New-function. .INPUTS [PSObject[]] .OUTPUTS [PSObject[]] .EXAMPLE $Element | Update-AtwsObjectsWithParameters -BoundParameters $PSBoundParameters -Entity $EntityName Updates the properties of object $Element with the values of any parameter with the same name as a property- .NOTES NAME: Update-AtwsObjectsWithParameters #> [cmdletbinding()] Param ( [Parameter( Mandatory = $true, ValueFromPipeline = $true )] [PSObject[]] $InputObject, [Parameter( Mandatory = $true )] [System.Collections.Generic.Dictionary`2[System.string, System.Object]] $BoundParameters, [Parameter( Mandatory = $true )] [ValidateScript( { $Script:FieldInfoCache.Keys -contains $_ })] [string] $EntityName ) begin { # Enable modern -Debug behavior if ($PSCmdlet.MyInvocation.BoundParameters['Debug'].IsPresent) { $DebugPreference = 'Continue' } Write-Verbose ('{0}: Begin of function' -F $MyInvocation.MyCommand.Name) # Get updated field info about this entity $fields = Get-AtwsFieldInfo -Entity $entityName $result = @() } process { Write-Debug ('{0}: Query based on parameters, parsing' -F $MyInvocation.MyCommand.Name) # Loop through parameters and update any inputobjects with the given parameter values foreach ($parameter in $BoundParameters.GetEnumerator()) { # Get field info for the field with the same name as the parameter $field = $fields | Where-Object { $_.Name -eq $parameter.Key } # Limit processing to parameter that match an existing field if (($field) -or $parameter.Key -eq 'UserDefinedFields') { if ($field.IsPickList) { if ($field.PickListParentValueField) { # There is a parent field. The selection of this field depends on parent $parentField = $fields.Where{ $_.Name -eq $field.PickListParentValueField } # Get the Parent label and value $parentLabel = $BoundParameters.$($parentField.Name) $parentValue = $parentField.PickListValues | Where-Object { $_.Label -eq $parentLabel -and $_.IsActive } # Select pickListValue based on label -and parentValue $pickListValue = $field.PickListValues | Where-Object { $_.Label -eq $parameter.Value -and $_.ParentValue -eq $parentValue.Value -and $_.IsActive } } else { # No parent field. Select pickListValue based on value $pickListValue = $field.PickListValues | Where-Object { $_.Label -eq $parameter.Value -and $_.IsActive } } # Set value to the picklist index value, not the label $value = $pickListValue.Value } else { # It isn't a picklist. Use the value of the parameter unmodified $value = $parameter.Value } foreach ($object in $InputObject) { $object.$($parameter.Key) = $value } } } $result += $InputObject } end { Write-Debug -Message ('{0}: End of function, returning {1} {2}(s)' -F $MyInvocation.MyCommand.Name, $result.count, $entityName) Return $result } } |