PowerShell中的过滤关键字是什么作用?

13

我发现了一些使用 filter 命令的Powershell代码。我从未见过这个命令,但它基本上像这样工作:

enter image description here

它似乎像一个函数。如果我运行 Get-Command filter ,我会得到 The term 'filter' is not recognized as the name of a cmdlet, function, script file, or operable program. 的返回值,同样地,Get-Alias filter 也返回类似的信息。Get-Help filter 只是返回带有单词“Filter”的Cmdlets和Functions。如果我谷歌搜索“Powershell filter command”,我只能获取与 -Filter 参数和 Where-Object 语法相关的各种命令。

这个命令是什么,有什么用途?有没有相应的文档可供参考?谢谢!


1
有一篇在ServerFault上的帖子涵盖了这个问题。本质上,过滤器是一个只有处理脚本块的函数。https://serverfault.com/questions/551805/powershell-performance-difference-filter-vs-function - Persistent13
那个提示是哪张图片? - js2010
2
@js2010 Powershell(是的,我知道我使用闪电符号作为提示,我很奇怪)⚡⚡ - Mike Christensen
3个回答

14

简而言之,过滤器是一种仅能使用进程块的函数。基于此,它可以用于操作(过滤、修改等)管道对象。它们还允许您例如随模块提供预定义的过滤器函数,省去了100次编写复杂的Where-Objects脚本块的工作。

关于函数的介绍

过滤器

过滤器是一种在管道中每个对象上运行的函数类型。过滤器类似一个带有所有语句的进程块的函数。 以下过滤器从管道中获取日志条目,然后显示整个条目或仅显示条目的消息部分:

 filter Get-ErrorLog ([switch]$message)
 {
   if ($message) { Out-Host -InputObject $_.Message }
   else { $_ }
 }

这个链接提供了很好的解释和一些示例。

希望这可以帮助到你。


是的,这正是我正在寻找的。只是看到了语法,但从未见过,谷歌也没有太大帮助。当我看到不知道的东西时,我就喜欢学习。 - Mike Christensen

9
筛选器定义是一种语法糖,它可以更轻松地创建无需参数函数,其唯一目的是处理来自管道的输入(后者由自动变量$_表示),但无需显式声明process以确保每个输入对象被调用。

也就是说,例如:

filter Add-One { 1 + $_ }

是语法糖,其实质为:

function Add-One { process { 1 + $_ } }

无论是哪种定义,以下示例命令:

1, 2 | Add-One

将产生:

2
3

或许是因为它们的限制——不支持参数(或难以支持)、不支持使用-?进行调用等等——以及它们提供的有限语法便捷性,filter并不被广泛使用。


2

从名字上看,它应该是用于管道中的。但我并不经常看到它被使用。

PS C:\users\js> Filter plusone { $_ + 1 }
PS C:\users\js> Echo 1 | plusone
2

PS C:\users\js> Filter comma { '{0:n0}' -f $_ }
PS C:\users\js> 1234567890 | comma
1,234,567,890

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接