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
- 参数“Foo”绑定到参数
-Property
。参数 -InputObject
还没有绑定,因为我们没有显式地传递一个参数给它。
- 数组的第一个元素
$example
通过管道传递。参数 [PSCustomObject]@{ Foo = 4; Bar = 8 }
绑定到参数 $InputObject
.
process{}
部分 运行s。在那里我们可以从 $InputObject
获取当前管道对象并从 $Property
获取参数 -Property
的参数。所以process{}
的每个运行都会有不同的$InputObject
,但是$Property
是不变的,是常量。
- 数组的第二个元素
$example
通过管道传递。参数 [PSCustomObject]@{ Foo = 15; Bar = 16 }
绑定到参数 $InputObject
.
- 类似于 3),但
$InputObject
的值不同。
希望对主题有所启发。为了更好地理解,我建议阅读 About Pipelines,然后按照教程编写您自己的管道函数。只有在我成功编写了我的第一个真正的管道函数后,这个概念才真正让我感兴趣。
很抱歉问了一个新手问题,因为我正在学习 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
- 参数“Foo”绑定到参数
-Property
。参数-InputObject
还没有绑定,因为我们没有显式地传递一个参数给它。 - 数组的第一个元素
$example
通过管道传递。参数[PSCustomObject]@{ Foo = 4; Bar = 8 }
绑定到参数$InputObject
. process{}
部分 运行s。在那里我们可以从$InputObject
获取当前管道对象并从$Property
获取参数-Property
的参数。所以process{}
的每个运行都会有不同的$InputObject
,但是$Property
是不变的,是常量。- 数组的第二个元素
$example
通过管道传递。参数[PSCustomObject]@{ Foo = 15; Bar = 16 }
绑定到参数$InputObject
. - 类似于 3),但
$InputObject
的值不同。
希望对主题有所启发。为了更好地理解,我建议阅读 About Pipelines,然后按照教程编写您自己的管道函数。只有在我成功编写了我的第一个真正的管道函数后,这个概念才真正让我感兴趣。