【问题标题】:What does $_ TRULY mean in PowerShell? [duplicate]$_ TRULY 在 PowerShell 中是什么意思? [复制]
【发布时间】:2012-10-26 01:38:57
【问题描述】:

可能重复:
What does $_ mean in powershell?

我已经在同一主题上看到过其他人的 question and answer,但对我来说它没有回答问题。

我知道如何使用 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)?即:

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

?

【问题讨论】:

  • 这不是另一个问题的完全重复(我在这个问题的第一行中说过)。 other 问题或多或少问如何使用 它,而不是means 是什么。您可以看出这不是重复的,因为接受的答案不同。 zdan 的回答表明可以将某些内容直接通过管道传输到过滤器,而 JaredPar 的回答显示某些内容正在通过管道传输到 ForEach-Object。两者的区别是直接调用过滤器或将过滤器传递给另一个过滤器然后执行它。

标签: .net powershell scripting


【解决方案1】:

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

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

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

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

【讨论】:

  • 感谢这个答案完美地解释了 $_ 是什么。
【解决方案2】:

$_ 是当前管道项。

例如:

 dir | ForEach-Object { $_.Name }

意思:

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

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

【讨论】:

    猜你喜欢
    • 2020-10-27
    • 2015-07-15
    • 2018-07-17
    • 2012-08-13
    • 1970-01-01
    • 1970-01-01
    • 2011-04-16
    • 1970-01-01
    • 2011-03-30
    相关资源
    最近更新 更多