与 Get-ChildItem cmdlet 的 -Ininclude 参数混淆

问题描述 投票:0回答:6

来自文档:

-包括

仅检索指定的项目。 该参数的值符合条件 路径参数。输入路径 元素或模式,例如“*.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 的内容 目录...

这也是错误的。例如

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

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

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

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

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

powershell include get-childitem
6个回答
15
投票

您混淆了 -include 的使用。 -include 标志应用于路径,而不是路径的内容。如果不使用递归标志,唯一有问题的路径就是您指定的路径。这就是为什么您给出的最后一个示例有效,路径

c:\test
在路径中有一个 t 因此匹配
"*t"

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

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

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

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


9
投票

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

dir -过滤器*.txt


5
投票

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

例如:

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

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

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

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

这应该会给你带来你正在寻找的“更简单”的行为。


3
投票

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

答案在命令的完整描述中(get-help get-childitem -full):

包含参数有效 仅当命令包含 递归参数或路径通向 目录的内容,例如 C:\Windows\*,其中通配符 字符指定的内容 C:\Windows 目录。

所以下面的代码无需递归即可工作。

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

来自 Stack Overflow 问题 PowerShell 脚本 - Get-ChildItem

我希望这有帮助:-)


1
投票

在路径末尾包含

\*
应该可以解决该问题

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"}

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


1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.