If you get a parameter via the pipeline and don’t use a process block, you will operate just on the last input.
function PrintFromPipeline { param ( [Parameter(ValueFromPipeline)] [string[]] $InputObject ) foreach ($Item in $InputObject) { Write-Output $Item } } '1', '2', '3' | PrintFromPipeline # 3
You don’t even need the foreach loop, cause the process block will be executed for every pipeline input.
function PrintFromPipeline { param ( [Parameter(ValueFromPipeline)] [string[]] $InputObject ) process { Write-Output $InputObject } } '1', '2', '3' | PrintFromPipeline # 1 # 2 # 3