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


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

更新于: 2020 年 10 月 16 日

115 次查看

开启你的 职业生涯

通过完成课程获得认证

开始
广告