Categories

Pipeline input

A question on the forum asked about creating a function that accepts pipeline input OR has a path parameter.  Means it can be used like this

myfunction -Path C:\scripts\Test\proc.csv

or

(Get-Content C:\scripts\Test\files.txt) | myfunction

First create a csv file

Get-Process | Export-Csv proc.csv –NoTypeInformation

and test its contents

Import-Csv proc.csv

The full path to the csv file is:-  C:\scripts\Test\proc.csv

The function is like this

function myfunction{             
[CmdletBinding()]             
param (             
[parameter(ValueFromPipeline=$true,             
   ValueFromPipelineByPropertyName=$true)]            
   [string]$Path            
)             
PROCESS{            
 if (-not (Test-Path -Path $path)){            
   Throw "Path NOT found $path"            
 }            
            
 Import-Csv -Path $path            
            
}#process             
            
}


Use [CmdletBinding()] to get the debug and verbose parameters



Use ValueFromPipeline and ValueFromPipelineByPropertyName attributes [parameter()]



This covers generic input and if we have a csv with path as a column.



if you are accepting pipeline input you need to use a PROCESS block



Then the path is tested and rejected if not valid. Finally import-csv is used to read the file

2 Responses to Pipeline input

  • And if you are implementing only Process block, you can use ‘filter’, instead of ‘function’. Filters are the same function with the only Process block. Filters cannot implement Begin/End blocks:
    filter myfilter{
    [CmdletBinding()]
    param (
    [Parameter(ValueFromPipeline = $true, ValueFromPipelineByPropertyName=$true)]
    $path
    )
    #if (-not (Test-Path -Path $path)) {
    # Throw “Path NOT found $path”
    #}
    #Import-Csv -Path $path
    $path.name
    }

  • RichardSiddaway says:

    I would not recommend using filter.

    They don’t really add anything and can become confusing

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>