I have already seen someone else's 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]

最佳答案

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

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

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

这在命令行上并不十分方便,因此$ _自动变量。

07-24 09:52
查看更多