select-object cmdlet 如何通过管道接受输入?

How select-object cmdlet accepts input by pipeline?

很抱歉问了一个新手问题,因为我正在学习 Powershell,我很困惑 select-object -属性 parameter 如何与管道一起工作。如 help 中所述,它不通过管道接受值。

例如:下面的代码应该给出了一个错误: get-process|select-object -property name,vm,pm

谁能解释或指导我,在此先感谢。

为了更好地理解 Select-Object 的工作原理,这里有一个非常简化的演示函数,其工作方式类似于 Select-Object

function Select-ObjectSimplified {
    [CmdletBinding()]
    param (
        # "ValueFromPipeline" means this parameter accepts pipeline input
        [Parameter(Mandatory, ValueFromPipeline)] [PSObject] $InputObject,

        # This parameter does NOT accept pipeline input
        [Parameter(Mandatory)] [Object[]] $Property
    )
    
    # The process section runs for each object passed through the pipeline.
    process {
        # Create an ordered hashtable that will store the names and values 
        # of the selected properties.
        $OutputObject = [ordered] @{}

        # Loop over each property of $InputObject
        foreach( $InputObjectProperty in $InputObject.PSObject.Properties ) {

            # Check if the current property is listed in -Property argument.
            if( $Property -contains $InputObjectProperty.Name ) {

                # Add the current property to the output object.
                $OutputObject[ $InputObjectProperty.Name ] = $InputObjectProperty.Value
            }
        }

        # Convert the hashtable to a PSCustomObject and (implicitly) output it.
        [PSCustomObject] $OutputObject
    }   
}

演示:

# Create an array of two objects.
$example = [PSCustomObject]@{ Foo = 4;  Bar = 8  },
           [PSCustomObject]@{ Foo = 15; Bar = 16 }

# Pass the array as input to the pipeline.
$example | Select-ObjectSimplified -Property Foo | Format-List

输出:

Foo : 4

Foo : 15

虽然参数-Property不接受pipelineinput,但是我们在processpipeline的时候还是可以使用的绑定到参数 -InputObject 的输入。 -Property 不需要接受管道输入,因为它在整个 运行 管道期间保持 不变

该演示由 PowerShell 执行如下:

$example | Select-ObjectSimplified -Property Foo | Format-List

  1. 参数“Foo”绑定到参数 -Property。参数 -InputObject 还没有绑定,因为我们没有显式地传递一个参数给它。
  2. 数组的第一个元素$example通过管道传递。参数 [PSCustomObject]@{ Foo = 4; Bar = 8 } 绑定到参数 $InputObject.
  3. process{} 部分 运行s。在那里我们可以从 $InputObject 获取当前管道对象并从 $Property 获取参数 -Property 的参数。所以process{}的每个运行都会有不同的$InputObject,但是$Property是不变的,是常量。
  4. 数组的第二个元素$example通过管道传递。参数 [PSCustomObject]@{ Foo = 15; Bar = 16 } 绑定到参数 $InputObject.
  5. 类似于 3),但 $InputObject 的值不同。

希望对主题有所启发。为了更好地理解,我建议阅读 About Pipelines,然后按照教程编写您自己的管道函数。只有在我成功编写了我的第一个真正的管道函数后,这个概念才真正让我感兴趣。