$ _是什么意思在PowerShell中?

我已经在PowerShell中看到了很多,但是它究竟做了什么?

$_ 

这是pipe道中当前值的variables。

 1,2,3 | %{ write-host $_ } 

例如在上面的代码中,为数组中的每个值调用%{}块。 $_variables将包含当前值。

我认为最简单的方法就是在C#中的lambdaexpression式中考虑像input参数这样的variables。 即$_类似于x中的x => Console.WriteLine(x)在C#中的匿名函数。 考虑下面的例子:

电源shell:

 1,2,3 | ForEach-Object {Write-Host $_} 

打印:

 1 2 3 

要么

 1,2,3 | Where-Object {$_ -gt 1} 

打印:

 2 3 

并将其与使用LINQ的C#语法进行比较:

 var list = new List<int> { 1, 2, 3 }; list.ForEach( _ => Console.WriteLine( _ )); 

打印:

 1 2 3 

要么

 list.Where( _ => _ > 1) .ToList() .ForEach(s => Console.WriteLine(s)); 

打印:

 2 3 

根据这个网站,这是一个参考,主要是循环。

$ _(美元下划线)“THIS”令牌。 通常指的是在foreach循环中的项目。 任务:打印集合中的所有项目。 解。 … | foreach {Write-Host $ _}

$ _是一个variables,它遍历从前一个|传递的每个对象/元素 (pipe)。

$ _是自动variables$ PSItem的一个别名(在PowerShell V3.0中引入; 使用信息在这里find )代表pipe道中的当前项目。

$_是系统通常在块expression式中创build的一个variables,这些块expression式由与pipe道一起使用的cmdlet引用,例如Where-ObjectForEach-Object

但也可以用于其他types的expression式,例如Select-Object与expression式属性结合使用。 Get-ChildItem | Select-Object @{Name="Name";Expression={$_.Name}} Get-ChildItem | Select-Object @{Name="Name";Expression={$_.Name}} 。 在这种情况下, $_表示正在pipe理的项目,但可能存在多个expression式。

它也可以通过自定义参数validation来引用,其中脚本块用于validation值。 在这种情况下, $_表示从调用中收到的参数值。

最接近c#和java的比喻是lamdaexpression式。 如果你打破了PowerShell的基础,那么一切都是一个脚本块,包括脚本文件,函数和cmdlet。 您可以定义自己的参数,但是在某些情况下,由系统为您创build的参数表示要处理/评估的input项目 。 在这些情况下,自动variables是$_