我在PowerShell中经常看到以下内容,但它到底是做什么的呢?
$_
oxiaedzo1#
这是管线中当前值的变量,在Powershell 3和更新版本中称为$PSItem。
$PSItem
1,2,3 | %{ write-host $_ }
或
1,2,3 | %{ write-host $PSItem }
例如,在上面的代码中,为数组中的每个值调用%{}块。$_或$PSItem变量将包含当前值。
%{}
j8yoct9x2#
我认为最简单的方法就是把这个变量看作是C#中lambda表达式中的输入参数。也就是说,$_类似于C#中x => Console.WriteLine(x)匿名函数中的x。考虑以下示例:动力 shell :
x => Console.WriteLine(x)
x
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( _ ));
list.Where( _ => _ > 1) .ToList() .ForEach(s => Console.WriteLine(s));
n3schb8v3#
根据this网站,它是对this的引用,主要是在循环中。$(美元下划线)“THIS”标记。通常指foreach循环内的项。任务:打印集合中的所有项。解决方案...|foreach {写入主机$ }
this
bcs8qyzn4#
$_是自动变量$PSItem的别名(在PowerShell V3.0中引入;Usage information found here),它表示管道中的当前项目。PowerShell(v6.0)自动变量的联机文档为here。
oipij1gg5#
$_是由系统创建的变量,通常位于块表达式内,该块表达式由与管道一起使用的cmdlet(例如Where-Object和ForEach-Object)引用。但是,它也可以用于其它类型的表达式,例如,Select-Object与表达式属性. Get-ChildItem | Select-Object @{Name="Name";Expression={$_.Name}}的组合。在这种情况下,$_表示要管道传输的项,但可以存在多个表达式。它也可以被自定义参数验证引用,在自定义参数验证中,脚本块用于验证值。在这种情况下,$_表示从调用中接收的参数值。与c#和java最接近的类比是lamda表达式。如果你把powershell分解成基本的,那么所有的东西都是一个脚本块,包括脚本文件a,函数和cmdlet。你可以定义自己的参数,但在某些情况下,系统会为你创建一个参数,代表 * 要处理/计算的输入项 *。在这些情况下,自动变量是$_。
Where-Object
ForEach-Object
Select-Object
Get-ChildItem | Select-Object @{Name="Name";Expression={$_.Name}}
cwxwcias6#
$_是一个变量,它迭代从上一个传递过来的每个对象/元素|(烟斗)。
jvidinwx7#
是一个$PSItem,本质上是从另一个命令中通过管道传输的对象。例如,在我的工作站上运行Get-Volume会返回PSItem的行,或者对象
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中的Terinary,我可以在使用PipedPSItem中的属性时缩短逻辑
7条答案
按热度按时间oxiaedzo1#
这是管线中当前值的变量,在Powershell 3和更新版本中称为
$PSItem
。或
例如,在上面的代码中,为数组中的每个值调用
%{}
块。$_
或$PSItem
变量将包含当前值。j8yoct9x2#
我认为最简单的方法就是把这个变量看作是C#中lambda表达式中的输入参数。也就是说,
$_
类似于C#中x => Console.WriteLine(x)
匿名函数中的x
。考虑以下示例:动力 shell :
图纸:
或
图纸:
并将其与使用LINQ的C#语法进行比较:
图纸:
或
图纸:
n3schb8v3#
根据this网站,它是对
this
的引用,主要是在循环中。$(美元下划线)“THIS”标记。通常指foreach循环内的项。任务:打印集合中的所有项。解决方案...|foreach {写入主机$ }
bcs8qyzn4#
$_是自动变量$PSItem的别名(在PowerShell V3.0中引入;Usage information found here),它表示管道中的当前项目。
PowerShell(v6.0)自动变量的联机文档为here。
oipij1gg5#
$_
是由系统创建的变量,通常位于块表达式内,该块表达式由与管道一起使用的cmdlet(例如Where-Object
和ForEach-Object
)引用。但是,它也可以用于其它类型的表达式,例如,
Select-Object
与表达式属性.Get-ChildItem | Select-Object @{Name="Name";Expression={$_.Name}}
的组合。在这种情况下,$_
表示要管道传输的项,但可以存在多个表达式。它也可以被自定义参数验证引用,在自定义参数验证中,脚本块用于验证值。在这种情况下,
$_
表示从调用中接收的参数值。与c#和java最接近的类比是lamda表达式。如果你把powershell分解成基本的,那么所有的东西都是一个脚本块,包括脚本文件a,函数和cmdlet。你可以定义自己的参数,但在某些情况下,系统会为你创建一个参数,代表 * 要处理/计算的输入项 *。在这些情况下,自动变量是
$_
。cwxwcias6#
$_是一个变量,它迭代从上一个传递过来的每个对象/元素|(烟斗)。
jvidinwx7#
是一个$PSItem,本质上是从另一个命令中通过管道传输的对象。例如,在我的工作站上运行Get-Volume会返回PSItem的行,或者对象
Driveletter和DriveType是属性。现在,您可以在使用$_.(propertyName)管道输出时使用这些项属性。(还要记住%是Foreach-Object的别名)例如
使用Powershell 7中的Terinary,我可以在使用PipedPSItem中的属性时缩短逻辑