12

从文档:

-包括

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

Include 参数仅在命令包含 Recurse 参数或路径指向目录的内容时才有效,例如 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 指定的所有实体。如果匹配的元素是一个文件 - 返回它。如果匹配的元素是文件夹,则查看内部并返回匹配的第一级子级。

此外,文档说:

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

这也是错误的。例如

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

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

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

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

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

4

6 回答 6

15

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

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

gci -path "c:\test" -in *e*

这仍然会产生目录中的所有孩子,但它与他们的名字都不匹配。

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

于 2009-04-26T14:05:43.930 回答
9

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

dir -filter *.txt

于 2009-04-26T16:57:23.330 回答
5

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

例如:

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

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

get-childitem "c:\test\*.txt"

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

这应该为您提供您正在寻找的“更简单”的行为。

于 2009-04-26T14:22:15.700 回答
2

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

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

The Include parameter is effective only when the command includes the

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

因此,以下内容无需递归即可工作。

PS C:\foo> Get-childitem -path "c:\foo*" -Include *.txt

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

我希望这有帮助 :-)

于 2009-09-02T21:40:58.283 回答
0

包括\*在路径的末尾应该可以解决这个问题

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

这应该从当前工作目录返回 .log 文件 ( C:\logfiles)

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

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

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

这应该排除设置了“目录”模式的任何内容。

于 2015-04-08T02:04:58.790 回答
0

get-childitem -include 仅适用于路径中的 -recursive 或通配符。我认为这是一个错误[认为它在 PS 6 中有所不同]。

于 2018-06-16T22:28:32.973 回答