Hi,
I'm confused with the pipeline processing of object-property-parameter association.
Here my Cmdlet example
Function test-psboundbug{
[CmdletBinding(DefaultParameterSetName='Parameter')]
param(
[Parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$true)]
[string]$Param1,
[Parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$true)]
[string]$Param2,
[Parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$true)]
[string]$Param3,
[Parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$true)]
[string]$Param4,
[Parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$true)]
[string]$Param5
)
Begin{}
Process{
Write-Host " ====== BEGIN - PROGRESS =============="
$PSBoundParameters
Write-Host " ====== BEGIN - PROGRESS =============="
}
End{}
}
$testParams=@()
$testParams+=@{Param1="Param1-1";Param2="Param2-1"}
$testParams+=@{Param1="Param1-2";Param2="Param2-2";Param3="Param3-2"}
$testParams+=@{Param1="Param1-3";Param2="Param2-3";Param4="Param4-3"}
$testParams+=@{Param1="Param1-4";Param2="Param2-4"}
$testParams+=@{Param1="Param1-5";Param2="Param2-5"}
$testParams|%{New-Object psobject -Property $_}|test-psboundbugwhen i send a array of objects through a pipline, i thoucht in every loop in the ''PROCESS''-Scriptblock the parameter accociation from the object properties is caculate exact on the behavior of the single object, which is active in processing.
But when the Property-Names are alterate in pipeline (see the example above), powershell is not resetting the $PSBoundParameters variable,but rather the $PSBoundParameters contains old values from the parent object in the pipeline loop, up to the end.
Here the Output of the example above:
====== BEGIN - PROGRESS ============== Key Value --- ----- Param1 Param1-1 Param2 Param2-1 ====== BEGIN - PROGRESS ============== ====== BEGIN - PROGRESS ============== Param1 Param1-2 Param2 Param2-2 Param3 Param3-2 ====== BEGIN - PROGRESS ============== ====== BEGIN - PROGRESS ============== Param1 Param1-3 Param2 Param2-3 Param3 Param3-2 Param4 Param4-3 ====== BEGIN - PROGRESS ============== ====== BEGIN - PROGRESS ============== Param1 Param1-4 Param2 Param2-4 Param3 Param3-2 Param4 Param4-3 ====== BEGIN - PROGRESS ============== ====== BEGIN - PROGRESS ============== Param1 Param1-5 Param2 Param2-5 Param3 Param3-2 Param4 Param4-3 ====== BEGIN - PROGRESS ==============
The $PSBoundParameters contains the value of Param3 und Param4 up to end of whole process. I can manually Reset $PSBoundParameter.Clean() on the End of the PROCESS-Block and all worked as expected.
My Question is , is this a bug or a feature.
Jens Müller