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

时间:2009-04-26 12:45:47

标签: powershell include get-childitem

来自文档:

  

-Include

     

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

     

Include参数仅在命令时有效   包括Recurse参数或   路径导致a的内容   目录,如C:\ Windows *,其中   通配符指定   C:\ Windows目录的内容。

我的第一个理解是:

c:\test\a.txt
c:\test\b.txt

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

gci -Path "c:\test\*" -Include "*.txt"

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

c:\test\a.txt
c:\test\b.txt
c:\test\c.txt\c.txt

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

实际逻辑似乎是:

  

-Include用于匹配-Path指定的所有实体。如果匹配元素   是一个文件 - 返回它。如果匹配   element是一个文件夹,看看里面和   返回匹配的第一级孩子。

此外,文件说:

  

Include参数仅在命令时有效   包括Recurse参数或   路径导致a的内容   目录...

这也是错误的。 E.g。

gci -Path "c:\test" -Include "*.txt"

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

gci -Path "c:\test" -Include "*t"

它返回a.txt,b.txt和c.txt,其中“* t”匹配“test”并匹配所有子项。

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

6 个答案:

答案 0 :(得分:14)

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

您可以尝试以下

来验证这一点
gci -path "c:\test" -in *e*

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

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

答案 1 :(得分:9)

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

dir -filter * .txt

答案 2 :(得分:5)

继续JaredPar's answer,为了与Get-ChildItem进行模式匹配,您可以使用常见的shell通配符。

例如:

get-childitem "c:\test\t?st.txt"

哪里有“?”是匹配任何一个字符或

的通配符
get-childitem "c:\test\*.txt"

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

这可以让你找到你想要的“更简单”的行为。

答案 3 :(得分:2)

我刚刚问了一个类似的问题,并就Get-ChildItem的Get-Help得到了三个快速回复。

  

答案在完整描述中   命令(Get-Help Get-ChildItem   -full):

The Include parameter is effective only when the command includes the
     

递归参数或路径指向   目录的内容,例如   C:\ Windows *,其中的通配符   character指定的内容   C:\ Windows目录。

     

所以以下内容无效   递归。

     

PS C:\ foo> Get-childitem -path   “c:\ foo *” - 包含* .txt

来自Stack Overflow问题 PowerShell Scripting - Get-ChildItem

我希望这会有所帮助: - )

答案 4 :(得分:0)

在路径末尾包含\*应解决问题

PS C:\logfiles> Get-ChildItem .\* -include *.log

这应该返回当前工作目录(C:\logfiles

中的.log文件

上面的Alex示例表明还将返回名为foo.log的目录。当我尝试它时,它不是6年之后,而且可能来自PS更新。

但是,您可以使用子项Mode来排除我认为的目录。

PS C:\logfiles> Get-Childitem .\* -include *.log | where-object {$_.mode -notmatch "d"}

这应该排除任何带有'目录'模式设置。

答案 5 :(得分:0)

get-childitem -include仅适用于路径中的-recursive或通配符。我认为这是一个错误。它已在Powershell 6中修复。