Powershell pipeline object to function

powershell

Here's the stub of what I'm trying to do:

function Set-test {
[CmdletBinding()]
    param(
        [Parameter(Mandatory=$True,
               ValueFromPipeline=$True)]
        [object[]]$inputObject
    )
    Write-Verbose "Set-test: input obj= $inputObject" 

    PROCESS {
        foreach ($obj in $inputobject) {
            Write-Output $obj
        }
    }   
}

function Get-test {
    $obj = New-Object PSObject
    $obj | Add-Member -MemberType NoteProperty -Name "swName" -Value "banana"
    $obj | Add-Member -MemberType NoteProperty -Name "Version" -Value "3.2.2"
    Write-Output "obj = $obj"
    $obj | Set-test -verbose    
}

Here's the output:

PS > Get-test
obj = @{swName=banana; Version=3.2.2}
VERBOSE: Set-test: input obj= 
Get-Process : Cannot evaluate parameter 'Name' because its argument is  specified as a script block and there is no input. A script block cannot be evaluated without input.
At C:\Users\username\Documents\WindowsPowerShell\Modules\mytool\mytools.psm1:204 char:13
+     PROCESS {
+             ~
+ CategoryInfo          : MetadataError: (:) [Get-Process], ParameterBindingException
+ FullyQualifiedErrorId : ScriptBlockArgumentNoInput,Microsoft.PowerShell.Commands.GetProcessCommand

As seen from the verbose output it appears that the object is not being piped to the function and it has me baffled.

Best Answer

You can't have that write-verbose in the set-test outside of a begin{}, process{} or end{} block. It's messing things up. If you move it inside the process{} block it works fine.