来自文档:
-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如何工作,我也不明白何时使用它。为什么我需要它来查看子文件夹内?为什么要这么复杂?
答案 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
)
上面的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中修复。