Tah*_*san 6 .net powershell scripting
可能重复:
在powershell中$ _的含义是什么?
我已经在同一主题上看到了别人的问题和答案,但对我来说它并没有回答这个问题.
我知道如何使用Select-Object,Where-Object,ForEach-Object等并传递一个脚本块,例如:
dir | ForEach-Object { $_.Name }
Run Code Online (Sandbox Code Playgroud)
它返回当前目录中所有文件名的数组.
这类似于C#的Select扩展方法:
Dir.Select(x => x.Name)
Run Code Online (Sandbox Code Playgroud)
但是,上面的C#很容易理解,因为我们将一个函数传递给Select方法,然后Select方法为列表中的每个元素执行它.
但是,PowerShell中的等价物:
dir | ForEach-Object { param($x) $x.Name }
Run Code Online (Sandbox Code Playgroud)
没有任何回报.然而
& { param($x) $x.Name } (dir)[0]
Run Code Online (Sandbox Code Playgroud)
按预期工作.
有人可以向C#熟悉的人解释$ _的魔力而不是脚本世界吗?这是一个特殊的关键字?它是否只能用于传递给cmdlet的脚本块?如何在不使用ForEach-Object(或任何其他cmdlet)的情况下调用一个?即:
& { $_.Name } (dir)[0]
Run Code Online (Sandbox Code Playgroud)
?
在$_
仅在一个流水线的上下文中创建,即输出对象的通过从一个命令到所述的另一个"输入".对于管道过滤器(类似于函数),powershell会自动$_
使用管道的当前对象填充变量.现在我说当前是因为重要的是要注意当从管道传递多个对象时,每个对象执行一次过滤器的进程脚本块.
现在,您可以将管道对象重命名为其中一个输入参数,但您必须告诉powershell您正在这样做.例如:
# C:\> filter get-name-filt {Param([parameter(ValueFromPipeline=$true)]$x) $x.name}
# C:\> (dir)[0] | get-name-filt
Run Code Online (Sandbox Code Playgroud)
这在命令行上并不是非常方便,因此$ _自动变量.