![](/img/trans.png)
[英]Ambiguous behavior by Get-ChildItem cmdlet in Powershell
[英]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.