$_在PowerShell中是什么意思?

我在PowerShell中见过很多下面的代码,但是它到底是做什么的呢?

$_
311214 次浏览

根据网站,它是this的引用,主要是在循环中。

$_($下划线) “这”牌。通常是指 项目在foreach循环中。 任务: 打印集合中的所有项目。 解决方案……| foreach{写主机 $ _} < / p >

这是管道中当前值的变量,在Powershell 3及更新版本中称为$PSItem

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

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

例如,在上面的代码中,数组中的每个值都会调用%{}块。$_$PSItem变量将包含当前值。

我认为把这个变量理解为c#中的lambda表达式中的输入参数是最简单的方法。例如,$_类似于c#中的x => Console.WriteLine(x)匿名函数中的x。考虑以下例子:

PowerShell:

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

$_是一个迭代前一个|(管道)传递的每个对象/元素的变量。

$_是自动变量$PSItem的别名(在PowerShell V3.0中引入;这里有使用信息),表示来自管道的当前项。

PowerShell (v6.0)自动变量的在线文档是在这里

$_是一个由系统创建的变量,通常在块表达式中被cmdlet引用,这些cmdlet与Where-ObjectForEach-Object等管道一起使用。

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

还可以通过自定义参数验证引用它,其中使用脚本块验证值。在这种情况下,$_表示从调用接收到的参数值。

与c#和java最接近的类比是lambda表达式。如果你把powershell分解为基础,那么所有东西都是一个脚本块,包括脚本文件a、函数和cmdlet。你可以定义自己的参数,但在某些情况下,系统会为你创建一个表示要处理/评估的输入项的参数。在这些情况下,自动变量是$_

$_是一个$PSItem,本质上是一个从另一个命令管道传入的对象。 例如,在我的工作站上运行Get-Volume将返回PSItems行或对象

get-volume | select driveLetter,DriveType


driveLetter DriveType
----------- ---------
D      Fixed
Fixed
C      Fixed
A      Removable

Driveletter和DriveType是属性 现在,您可以在使用$_.(propertyName)管道输出时使用这些项属性。(还要记住%是Foreach-Object的别名)例如

$vol = get-volume | select driveLetter,DriveType


$vol | Foreach-Object {
if($_.DriveType -eq "Fixed") {
"$($_.driveLetter) is $($_.driveType)"}
else{
"$($_.driveLetter) is $($_.driveType)"
}
}


在Powershell 7中使用三元,我能够在使用来自Piped PSItem的属性时缩短逻辑