我在PowerShell中看到了很多,但它究竟做了什么?
$_
我在PowerShell中看到了很多,但它究竟做了什么?
$_
这是管道中当前值的变量。
1,2,3 | %{ write-host $_ }
例如,在上面的代码%{}
块被称为该数组中的每一个值。 $_
变量将包含当前值。
这不一定与管道有关。这更多的是“当前正在执行的脚本块的当前参数”。例如,虽然你可以在ForEach-Object或Where-Object中使用它,但是你不能像'Get-Foo | Add-Member NoteProperty Bar($ _。SomeProperty)'那样使用它 - 有一个涉及的管道,但没有脚本块,因此没有'$ _'。 (也就是说,PowerShell的帮助也指'$ _'的管道。令人困惑) – Joey 2010-08-16 16:23:54
@JaredPar请自$ PS3以后添加有关$ PSItem作为别名的信息。 – ALIENQuake 2015-07-22 17:46:44
@Joey你可以在你的例子中完全使用$ _。 'Get-Foo | Add-Member -Type NoteProperty -Name Bar -Value $ _。SomeProperty' – Xalorous 2015-11-06 16:38:00
我想在C#中的lambda表达式中考虑这个变量的最简单方法就像输入参数。即$_
类似于x
的x => Console.WriteLine(x)
C#中的匿名函数。考虑下面的例子:
的PowerShell:
1,2,3 | ForEach-Object {Write-Host $_}
打印:
1
2
3
或
1,2,3 | Where-Object {$_ -gt 1}
打印:
2
3
并采用与C#语法比较这LINQ:
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
在C#中,不要在lambda中使用'_'作为输入参数。当参数被忽略时有时使用'_',用x代替。 http://stackoverflow.com/questions/424775/is-there-a-better-way-to-express-a-parameterless-lambda-than – 2013-10-14 17:54:31
$ _是一个变量,迭代从前一个|传递的每个对象/元素(管)。
$ _是自动变量$ PSItem的一个别名(在PowerShell V3.0中引入; Usage information found here),它代表管道中的当前项目。
$_
通常是内部由小命令引用块表达式是与管的系统所使用创建的变量如Where-Object
和ForEach-Object
。
但它也可用于其他类型的表达式,例如与Select-Object
结合使用表达式属性。 Get-ChildItem | Select-Object @{Name="Name";Expression={$_.Name}}
。在这种情况下,$_
表示正在管理的项目,但可能存在多个表达式。
它也可以通过自定义参数验证来引用,其中脚本块用于验证值。在这种情况下,$_
代表从调用中收到的参数值。
与c#和java最接近的比喻是lamda表达式。如果您将PowerShell分解为基础知识,那么一切都是包含脚本文件a,函数和cmdlet的脚本块。您可以定义自己的参数,但在某些情况下系统会为您创建一个代表的输入项以处理/评估。在这些情况下,自动变量是$_
。
很好的问题。我想为其他暗示的标记提供更多的信息 – MattUebel 2010-08-26 12:56:29
当然,这个问题已经回答了给出的单个特殊标记,但是为了说明PowerShell特殊标记的所有壁挂图,请参阅[PowerShell标点符号完整指南]( https://www.simple-talk.com/sysadmin/powershell/the-complete-guide-to-powershell-punctuation/) – 2016-11-16 22:04:12