Can I determine if a PowerShell function is running as part of a pipeline?

前端 未结 2 1224
生来不讨喜
生来不讨喜 2021-02-07 10:52

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

2条回答
  •  甜味超标
    2021-02-07 11:40

    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
    

提交回复
热议问题