6

可能重复:
$_ 在 powershell 中是什么意思?

我已经看过其他人关于同一主题的问答,但对我来说,它并没有回答这个问题。

我知道如何使用 Select-Object、Where-Object、ForEach-Object 等并传入一个脚本块,例如:

dir | ForEach-Object { $_.Name }

它返回当前目录中所有文件名的数组。

这类似于 C# 的 Select 扩展方法:

Dir.Select(x => x.Name)

但是,上面的 C# 很容易理解,因为我们将一个函数传递给 Select 方法,然后它会为列表中的每个元素执行它。

但是,PowerShell 中的等价物:

dir | ForEach-Object { param($x) $x.Name }

不返回任何东西。然而

& { param($x) $x.Name } (dir)[0]

按预期工作。

有人可以向熟悉 C# 但不熟悉脚本世界的人解释 $_ 的魔力吗?它是一个特殊的关键字?它只能用于传递给 cmdlet 的脚本块吗?您如何调用一个而不将一个管道传递给 ForEach-Object(或任何其他 cmdlet)?IE:

& { $_.Name } (dir)[0]

?

4

2 回答 2

9

$_仅在管道的上下文中创建,即将输出对象从一个命令传递到另一个命令的“输入” 。对于管道过滤器(类似于函数),powershell 会自动使用管道的当前对象填充$_变量。现在我说当前是因为重要的是要注意当多个对象通过管道传递时,过滤器的进程脚本块每个对象执行一次。

现在,您可以将管道对象重命名为您的输入参数之一,但您必须告诉 powershell 您正在这样做。例如:

# C:\> filter get-name-filt {Param([parameter(ValueFromPipeline=$true)]$x) $x.name}
# C:\> (dir)[0] | get-name-filt

这在命令行上不是很方便,因此 $_ 自动变量。

于 2012-10-25T17:37:36.110 回答
4

是当前$_管道项目。

例如:

 dir | ForEach-Object { $_.Name }

方法:

  1. 运行目录命令
  2. 将输出传递给下一个管道命令
  3. ForEach-Object 使用 dir 的输出作为名为 $_ 的变量

由于 的输出dir具有属性.name,因此流水线的输出$_也将具有相同的属性。这只是一种通过管道传递数据的方法

于 2012-10-25T17:38:57.840 回答