0

编辑希望在这里澄清我令人费解和误导性的问题......基于我错误的假设 -file 接受输入。感谢您直截了当地指出这只是一个开关参数;我的示例中的输入实际上被传递给 -path。听起来这可能是搜索多种文件类型的最快的纯 powershell 方法,因为 -filter 只接受单个输入,而 -include 速度较慢。

get-childItem文档说“过滤器比其他参数更有效,因为提供程序在检索对象时应用它们,而不是让 Windows PowerShell 在检索对象后对其进行过滤。”

v3 有一个带有 -file 参数的新参数集,可能是为了排除目录,以匹配 cmd.exe 的dir /a:-d

与 -include 一样,与 -filter 不同,-file 接受多个,如gci -file "*.ldf","*.bak"

所以我想知道,并且迄今为止未能可靠地测试,如果 -file 从性能角度来看就像 -filter,即“更有效”,或者更像是像 -include 这样的“其他参数”。如果 -file 是一个过滤器,那很好,因为 afaict -filter 一次只处理一个过滤器,所以如果您想要多个过滤器(如 *.ldf 和 *.bak),那么您需要运行gci -filter两次或使用 -include 代替。所以我想知道 -file 是否可以让我们为多个过滤器获得过滤器的效率优势。

我偶然发现了一些让我乐观的错误文本。-file 参数希望 -path 成为当前目录,因此gci -path $path -file "*.bak","*.ldf"会出错。Push-location 似乎是一种可行的解决方法,但在这里我对错误文本的内容更感兴趣:

Get-ChildItem:无法将“System.Object[]”转换为参数“Filter”所需的类型“System.String”。不支持指定的方法。

我调用了-file,但错误抱怨“参数'过滤器'”。所以也许 -file 像过滤器一样有效?OTOH,-filter 不需要 -path 是当前目录,因此在这方面 -file 更像 -include。

4

1 回答 1

3

只有一种精度:

gci -path $path -file "*.bak","*.ldf"

-file is a switch parameter (as -directory is) and doesn't accept values (To get only files, use the File parameter and omit the Directory parameter. To exclude files, use the Directory parameter and omit the File parameter); then the "*.bak","*.ldf" are implicitly passed to -filter as value, and filter accept only string and not string[]. That's where your error came from.

Regarding performance: using -file or -directory is faster than using a where-object psiscontainer or ? { !$_.psiscontainer} because it's done at provider (filesystem in this case) level.

于 2012-12-07T20:38:37.780 回答