【发布时间】:2012-10-26 01:38:57
【问题描述】:
我已经在同一主题上看到过其他人的 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