混淆了Get-ChildItem cmdlet的-Include参数

ale*_*2k8 11 powershell include get-childitem

来自文档:

-包括

仅检索指定的项目.此参数的值限定Path参数.输入路径元素或模式,例如"*.txt".允许使用通配符.

仅当命令包含Recurse参数或路径指向目录内容(例如C:\ Windows*)时,Include参数才有效,其中通配符指定C:\ Windows目录的内容.

我的第一个理解是:

c:\test\a.txt
c:\test\b.txt
Run Code Online (Sandbox Code Playgroud)

所以要得到'a.txt'和'b.txt'我可以写:

gci -Path "c:\test\*" -Include "*.txt"
Run Code Online (Sandbox Code Playgroud)

这很有效.但现在考虑这样的等级:

c:\test\a.txt
c:\test\b.txt
c:\test\c.txt\c.txt
Run Code Online (Sandbox Code Playgroud)

相同的命令返回:a.txt,b.txt,c.txt

实际逻辑似乎是:

-Include用于匹配-Path指定的所有实体.如果匹配元素是文件 - 返回它.如果匹配的元素是文件夹,请查看内部并返回匹配的第一级子项.

此外,文件说:

仅当命令包含Recurse参数或路径指向目录内容时,Include参数才有效...

这也是错误的.例如

gci -Path "c:\test" -Include "*.txt"
Run Code Online (Sandbox Code Playgroud)

它什么都不返回,而没有-Include我得到文件夹内容.所以 - 包含绝对是"有效的".这里到底发生了什么?-Path指定"c:\ test",-Include尝试匹配此路径.由于"*.txt"与"test"不匹配,因此没有返回任何内容.但看看这个:

gci -Path "c:\test" -Include "*t"
Run Code Online (Sandbox Code Playgroud)

它返回a.txt,b.txt和c.txt作为"*t"匹配的"test"并匹配所有子项.

毕竟,即使知道Include如何工作,我也不明白何时使用它.为什么我需要它来查看子文件夹内?为什么要这么复杂?

Jar*_*Par 14

你混淆了使用-include.-include标志应用于路径,而不是路径的内容.如果不使用递归标志,唯一有问题的路径就是您指定的路径.这就是为什么你给出的最后一个例子,路径c:\test在路径中的位置,因此匹配"*t".

您可以通过尝试以下方法来验证这一点

gci -path "c:\test" -in *e*
Run Code Online (Sandbox Code Playgroud)

这仍将生成目录中的所有子项,但它们不匹配任何名称.

-include对recurse参数更有效的原因是您最终对层次结构中的每个路径应用通配符.


Sha*_*evy 9

尝试使用-filter参数(它只支持一个扩展名):

dir -filter*.txt

  • 过滤器略有不同,因为它是特定于提供者的实现.它通常更有效,因为它发生在返回数据之前.但它确实为PowerShell中的每个驱动器提供程序提供了不同的实现.因此,匹配算法可能存在细微差别. (5认同)

Ste*_*ski 5

了解JaredPar的答案,为了与Get-ChildItem进行模式匹配,可以使用常见的shell通配符。

例如:

get-childitem "c:\test\t?st.txt"
Run Code Online (Sandbox Code Playgroud)

哪里的“?” 是与任何一个字符匹配的通配符,或者

get-childitem "c:\test\*.txt"
Run Code Online (Sandbox Code Playgroud)

它将匹配任何以“ .txt”结尾的文件名。

这应该使您获得所需的“简单”行为。