$_在PowerShell中是什么意思?

hjqgdpho  于 2023-01-13  发布在  Shell
关注(0)|答案(7)|浏览(278)

我在PowerShell中经常看到以下内容,但它到底是做什么的呢?

$_
oxiaedzo

oxiaedzo1#

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

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

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

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

j8yoct9x

j8yoct9x2#

我认为最简单的方法就是把这个变量看作是C#中lambda表达式中的输入参数。也就是说,$_类似于C#中x => Console.WriteLine(x)匿名函数中的x。考虑以下示例:
动力 shell :

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
n3schb8v

n3schb8v3#

根据this网站,它是对this的引用,主要是在循环中。
$(美元下划线)“THIS”标记。通常指foreach循环内的项。任务:打印集合中的所有项。解决方案...|foreach {写入主机$ }

bcs8qyzn

bcs8qyzn4#

$_是自动变量$PSItem的别名(在PowerShell V3.0中引入;Usage information found here),它表示管道中的当前项目。
PowerShell(v6.0)自动变量的联机文档为here

oipij1gg

oipij1gg5#

$_是由系统创建的变量,通常位于块表达式内,该块表达式由与管道一起使用的cmdlet(例如Where-ObjectForEach-Object)引用。
但是,它也可以用于其它类型的表达式,例如,Select-Object与表达式属性. Get-ChildItem | Select-Object @{Name="Name";Expression={$_.Name}}的组合。在这种情况下,$_表示要管道传输的项,但可以存在多个表达式。
它也可以被自定义参数验证引用,在自定义参数验证中,脚本块用于验证值。在这种情况下,$_表示从调用中接收的参数值。
与c#和java最接近的类比是lamda表达式。如果你把powershell分解成基本的,那么所有的东西都是一个脚本块,包括脚本文件a,函数和cmdlet。你可以定义自己的参数,但在某些情况下,系统会为你创建一个参数,代表 * 要处理/计算的输入项 *。在这些情况下,自动变量是$_

cwxwcias

cwxwcias6#

$_是一个变量,它迭代从上一个传递过来的每个对象/元素|(烟斗)。

jvidinwx

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中的属性时缩短逻辑

相关问题