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 管道进行传递。

