繁体   English   中英

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

[英]Confused with -Include parameter of the Get-ChildItem cmdlet

从文档:

-包括

仅检索指定的项目。 此参数的值限定了 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 是如何工作的,我也不明白什么时候使用它。 为什么我需要它查看子文件夹内部? 为什么要这么复杂?

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

您可以通过尝试以下操作来验证这一点

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

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

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

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

dir -filter *.txt

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

例如:

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

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

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

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

这应该会让你得到你正在寻找的“更简单”的行为。

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

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

 The Include parameter is effective only when the command includes the

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

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

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

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

我希望这有帮助 :-)

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM