In this post. Jeff describes how you can make a function act more like a cmdlet. The problem that you run into in V1 of PoweShell is that it is easy to make your functions work with the pipeline
Function Check-Service { Param([string]$service=”spooler” ) PROCESS { $wmi=get-wmiobject win32_service -filter “name=’$service’” -computername $_ if ($wmi.state -eq “running”) { write $True } else { write $False } } } Get-Content servers.txt | Check-Service
OR work well with parameters being passed in.
**Function Check-Service { Param([string[]]$server=$env:computername, [string]$service=”spooler” ) $wmi=get-wmiobject win32_service -filter “name=’$service’” -computername $server if ($wmi.state -eq “running”) { write $True } else { write $False } } Check-Service –Server Server01, Server02, Server03 **
Advanced functions in V2 of PowerShell can alleviate this problem (a topic for a whole new post), but a workaround I’ve found for V1 is to use the Begin block to take certain command line parameters and pass them back into the function via the pipeline.
Function Check-Service { Param([string[]]$server=$null,[string]$service=”spooler” ) BEGIN { if ($server -ne $null) { $server | Check-Service –Service $service } } PROCESS { if ($_ -ne $null) { $wmi=get-wmiobject win32_service -filter “name=’$service’” -computername $_ if ($wmi.state -eq “running”) { write $True } else { write $False } } } }
This enables both of the above scenarios:
Get-Content servers.txt | Check-Service
Check-Service –Server Server01, Server02, Server03
PSMDTAG:FAQ param
PSMDTAG:FAQ pipeline
Updated: (Missed a little recursion bug.. thanks Aleksandar!)