繁体   English   中英

管道和$ _在PowerShell中如何工作?

[英]How does pipeline and $_ work in PowerShell?

  1. Get-Process|Get-Member $_ ,为什么这不起作用? 如果$_代表管道中的当前对象,则上述输出不应该是每个流程对象的返回成员吗?
  2. cmdlet会一次或在有可用对象时立即将其所有输出对象传递到下一个cmdlet吗?
  3. 由于#1不起作用,我什么时候可以使用$_变量? 创建此变量的条件将比仅使用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-ObjectSelect-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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM