PowerShell 管道如何工作 - 第 2 部分?

powershellmicrosoft technologiessoftware & coding更新于 2026/2/10 12:22:17

在第 1 部分中,我们了解了使用 ValueFromPipeline 属性的 PowerShell 管道功能。还有另一个名为 ValueFromPipelineByPropertyName 的 cmdlet 属性,它对于了解 PowerShell 管道功能也很有用。

与第 1 部分的命令一样,我们可以使用相同的 Get-Command 获取此属性名称,但我们将用于该属性的过滤参数是 ValueFromPipelineByPropertyName。

以下示例适用于 Stop-Service cmdlet。

(Get-Command Stop-Service).ParameterSets.parameters | where{$_.ValueFromPipelineByPropertyName -eq 'True'} | Select Name,ParameterType

输出

Name ParameterType
---- -------------
Name System.String[]

这意味着您可以使用 Name 属性来停止服务。因此,我们将使用 Get-Service 及其 Name 属性来检索服务,然后将输出传递给 Stop-Service 命令来停止服务。

Get-Service "Spooler","W32Time" | Stop-Service -PassThru

输出

Status Name DisplayName
------ ---- -----------
Stopped Spooler Print Spooler
Stopped W32Time Windows Time

-PassThru 开关用于获取控制台中的输出。

为了便于理解,我们再举一个例子。第二个例子是 Stop-Process 命令。

(Get-Command Stop-Process).ParameterSets.parameters | where{$_.ValueFromPipelineByPropertyName -eq 'True'} | Select Name,ParameterType

输出

Name ParameterType
---- -------------
Id System.Int32[]
Name System.String[]

因此,在 Stop-Process 中,我们可以通过属性名称传递两个值:ID 和 Name。我们将使用 Get-Process 命令检索包含上述两个属性的输出,并通过管道将其传递给 Stop-Process。

Get-Process -Name pythonw, notepad | Stop-Process -Verbose

Get-Process -Id 21320,25740 | Stop-Process -Verbose

这就是 PowerShell 管道处理这两个属性的方式。我们可以编写代码来组合这两个属性,以便更好地了解使用管道传递的内容。

(Get-Command Stop-Process).ParameterSets.parameters `
| where{($_.ValueFromPipelineByPropertyName -eq 'True')
-or ($_.ValueFromPipeline -eq "True")} `
 | Select Name,ParameterType,ValueFromPipeline, ValueFromPipelineByPropertyName

输出

只需检查属性值为 True,即可根据 PowerShell 管道进行传递。


相关文章