2010-08-16 88 views
160

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

$_ 
+5

很好的问题。我想为其他暗示的标记提供更多的信息 – MattUebel 2010-08-26 12:56:29

+2

当然,这个问题已经回答了给出的单个特殊标记,但是为了说明PowerShell特殊标记的所有壁挂图,请参阅[PowerShell标点符号完整指南]( https://www.simple-talk.com/sysadmin/powershell/the-complete-guide-to-powershell-punctuation/) – 2016-11-16 22:04:12

回答

122

这是管道中当前值的变量。

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

例如,在上面的代码%{}块被称为该数组中的每一个值。 $_变量将包含当前值。

+31

这不一定与管道有关。这更多的是“当前正在执行的脚本块的当前参数”。例如,虽然你可以在ForEach-Object或Where-Object中使用它,但是你不能像'Get-Foo | Add-Member NoteProperty Bar($ _。SomeProperty)'那样使用它 - 有一个涉及的管道,但没有脚本块,因此没有'$ _'。 (也就是说,PowerShell的帮助也指'$ _'的管道。令人困惑) – Joey 2010-08-16 16:23:54

+2

@JaredPar请自$ PS3以后添加有关$ PSItem作为别名的信息。 – ALIENQuake 2015-07-22 17:46:44

+0

@Joey你可以在你的例子中完全使用$ _。 'Get-Foo | Add-Member -Type NoteProperty -Name Bar -Value $ _。SomeProperty' – Xalorous 2015-11-06 16:38:00

22

this网站,它以this参考,主要是在循环。

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

+0

+1链接 – Micah 2010-08-16 14:48:07

+13

+1双关语:'据此,这是一个参考这个'。 – Neolisk 2013-06-12 20:31:28

+1

'this'是'$ _'变量的一个相当混乱的术语。在OOP中它通常指的是类,而不是变量。 – 2015-11-06 16:39:46

29

我想在C#中的lambda表达式中考虑这个变量的最简单方法就像输入参数。即$_类似于xx => 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 
+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

1

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

0

$_通常是内部由小命令引用块表达式是与管的系统所使用创建的变量如Where-ObjectForEach-Object

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

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

与c#和java最接近的比喻是lamda表达式。如果您将PowerShell分解为基础知识,那么一切都是包含脚本文件a,函数和cmdlet的脚本块。您可以定义自己的参数,但在某些情况下系统会为您创建一个代表的输入项以处理/评估。在这些情况下,自动变量是$_