[英]How does pipeline and $_ work in PowerShell?
Get-Process|Get-Member $_
,为什么这不起作用? 如果$_
代表管道中的当前对象,则上述输出不应该是每个流程对象的返回成员吗? $_
变量? 创建此变量的条件将比仅使用cmdlet示例演示$_
的使用更为有用。 $_
是一个自动变量,可用于某些cmdlet的脚本块输入中,以表示管道中的当前项目。
Get-Process | Get-Member $_
Get-Process | Get-Member $_
不起作用,因为您通过|
将管道对象发送到Get-Member
|
,但是您将无法访问Get-Member
的内部。
您可以这样做:
Get-Process | ForEach-Object {
$_ | Get-Member
}
然后,对于Get-Process
输出的对象集合中的每个项目,您将获得Get-Member
输出,尽管这将是多余的,因为每个对象都是相同的。
Cmdlet确实一次将对象向下发送到管道。 您可以通过以下示例看到这一点:
Get-Process | ForEach-Object {
$_
Start-Sleep 1
}
您可以看到延迟增加,结果一出现就一次到达ForEach-Object
。
其他地方,你可以使用$_
变量在Where-Object
和Select-Object
。 例如:
Get-Process | Where-Object { $_.name -like 'win*' }
在这里, Where-Object
cmdlet接受管道的每个项目,我们使用$_
访问该项目的name属性,以查看它是否类似于字符串win
。 如果是,则将其继续发送(因此将其发送到控制台),否则, Where-Object
将其丢弃。
执行计算的属性时,可以在Select-Object
使用$_
。 例如:
Get-Process | Select-Object name,@{N='WorkingSetGB';E={$_.WorkingSet / 1GB}}
在这里,我们使用$_
获得每个项目的WorkingSet
属性,然后使用/ 1GB
将其转换为GB值。
是的, $_
代表管道中的当前对象,但是由于Get-Member接受管道输入,因此您只需将结果通过管道传递到cmdlet:
Get-Process | Get-Member
另一个例子是
Get-Process | Export-Csv MyFile.csv
同样,这里不需要$ _,因为Export-Csv接受管道输入,并通过管道接收一次一个进程的Get-Process的输出。 在Export-csv的实现内部有一个循环,但是这里不必关心您。
当将对象通过管道传递到ForEach-Object
cmdlet时,通常使用$_
:
Get-Process | ForEach-Object {
Write-Host $_.Name
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.