我在PowerShell中看到过以下内容,但它究竟做了什么?
$_
答案 0 :(得分:156)
这是管道中当前值的变量,在Powershell 3和更新版本中称为$PSItem
。
1,2,3 | %{ write-host $_ }
或
1,2,3 | %{ write-host $PSItem }
例如,在上面的代码中,为数组中的每个值调用%{}
块。 $_
或$PSItem
变量将包含当前值。
答案 1 :(得分:34)
我认为考虑这个变量的最简单方法就像在C#中的lambda表达式中的输入参数一样。即$_
类似于C#中x
匿名函数中的x => Console.WriteLine(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
答案 2 :(得分:27)
根据this网站,它是对this
的引用,主要是在循环中。
$ _(美元下划线) '这个'令牌。通常是指 foreach循环中的项目。 任务: 打印集合中的所有项目。 解。 ...... | foreach {写主持人 $ _}
答案 3 :(得分:4)
$ _是自动变量$ PSItem(在PowerShell V3.0中引入; Usage information found here)的别名,它代表管道中的当前项目。
PowerShell(v6.0)自动变量的在线文档是here。
答案 4 :(得分:1)
$ _是一个变量,它迭代从前一个|传递的每个对象/元素(配管)。
答案 5 :(得分:0)
$_
是由系统创建的变量,通常在块表达式中,由与Where-Object
和ForEach-Object
等管道一起使用的cmdlet引用。
但它也可以用在其他类型的表达式中,例如将Select-Object
与表达式属性结合使用。 Get-ChildItem | Select-Object @{Name="Name";Expression={$_.Name}}
。在这种情况下,$_
表示正在管道的项目,但可以存在多个表达式。
它也可以通过自定义参数验证引用,其中脚本块用于验证值。在这种情况下,$_
表示从调用接收的参数值。
与c#和java最接近的类比是lamda表达式。如果你将powershell分解为基础知识,那么一切都是脚本块,包括脚本文件a,函数和cmdlet。您可以定义自己的参数,但在某些情况下,系统会为您创建一个,表示要处理/评估的输入项。在这些情况下,自动变量为$_
。