Can a PowerShell function determine if it is being run as part of a pipeline? I have a function which populates an array with instances of FileInfo
which I would li
The "idiomatic" way to do this is to output a specific object type and then define formatting data for that object. The object can be a custom (C#/VB-based object) or a named PSObject. The advantage of this approach is that you can just output these objects and if there is no further pipeline output formatting (ie use of a Format
command) then you're defined default output formatting will get used. Otherwise, one of the Format
commands can override that default formatting. Here's an example:
PS> $obj = new-object psobject -Property @{FName = 'John'; LName = 'Doe'; `
BirthDate = [DateTime]"5/7/1965"}
PS> $obj.psobject.TypeNames.Insert(0, "MyNamespace.MyCustomTypeName")
PS> $obj
BirthDate FName LName
--------- ----- -----
5/7/1965 12:00:00 AM John Doe
PS> Update-FormatData .\MyCustomFormatData.ps1xml
PS> $obj
FName LName BirthDate
----- ----- ---------
John Doe 5/7/1965 12:00:00 AM
Notice how the default output is different the second time we sent $obj
down the pipe. That's because it used the custom formatting instructions provided since there were no explicit formatting commands used.
BTW there is always a pipeline even for $obj
because that is implicitly piped to Out-Default
.
Here is the custom format definition that is defined in a .ps1xml
file that I named MyCustomFormatData.xml:
MyNamespace.MyCustomTypeName
MyNamespace.MyCustomTypeName
25
left
25
left
25
left
FName
LName
BirthDate
For more examples of how to format custom objects look at the files output by this command:
Get-ChildItem $pshome\*.format.ps1xml