例如:
get-service | export-csv C:\services.csv
这到底发生了什么?
答案 0 :(得分:10)
Get-Service
的输出对象成为接受管道输入的Stop-Service
参数的输入。
对于stop-service,此参数为-InputObject
,它接受ServiceController
个对象(ServiceController[]
)。由于Get-Service
输出该类型的对象,您可以使用管道将其传递到Stop-Service
。如果有ServiceController
个对象的集合,则在称为流式传输的过程中,将为集合中的每个项目调用一次Stop-Service
。
当项目在管道上流式传输时,它们会在可用时立即继续。如果您想等到集合完成后才能通过它,您可以将输入包装在一组括号中。
查找接受管道输入的参数
如果您曾使用Get-Help
查找特定cmdlet,可以滚动到参数部分以查看哪个参数接受管道输入:
PS C:\> Get-Help Stop-Service -full
...
-InputObject <ServiceController[]>
Required? true
Position? 0
Accept pipeline input? true (ByValue)
Parameter set name InputObject
Aliases None
Dynamic? false
-Name <string[]>
Required? true
Position? 0
Accept pipeline input? true (ByValue, ByPropertyName)
Parameter set name Default
Aliases ServiceName
Dynamic? false
因此,通过查看该cmdlet的文档,我们可以看到您可以使用ServiceController对象的集合甚至服务的字符串名称作为管道输入。以下是使用相关cmdlet Get-Service的示例:
#Using a string
PS C:\Users\2.34> "MySQL" | Get-Service
Status Name DisplayName
------ ---- -----------
Running MySQL MySQL
#Using a ServiceController object
PS C:\> Get-Service "MySQL" | Get-Service
Status Name DisplayName
------ ---- -----------
Running MySQL MySQL
更多阅读
如果您有兴趣通过属性名称了解管道输入,那么有一篇很棒的TechNet文章here。您可以找到about_Pipelines
文档here。
答案 1 :(得分:2)
管道上的Powershell用户手册中有一章可能会有所帮助:
http://technet.microsoft.com/en-us/library/ee176927.aspx
管道基本上是一种规范化对象数据并以受控方式在cmdlet之间传递的机制,这样每个cmdlet都可以告诉管道中的前一个cmdlet或过滤器/函数何时准备好接收更多数据。