【问题标题】:Confused with -Include parameter of the Get-ChildItem cmdlet与 Get-ChildItem cmdlet 的 -Include 参数混淆
【发布时间】:2009-04-26 12:45:47
【问题描述】:

来自文档:

-包括

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

Include 参数仅在命令时有效 包括递归参数或 路径导致 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 参数仅在命令时有效 包括递归参数或 路径导致 a 的内容 目录...

这也是错误的。例如

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 是如何工作的,我也不明白什么时候使用它。为什么我需要它查看子文件夹内部?为什么要这么复杂?

【问题讨论】:

    标签: powershell include get-childitem


    【解决方案1】:

    您对 -include 的使用感到困惑。 -include 标志应用于路径,而不是路径的内容。如果不使用递归标志,唯一有问题的路径就是您指定的路径。这就是为什么您给出的最后一个示例有效,路径 c:\test 在路径中有一个 t,因此匹配 "*t"

    您可以通过以下方式验证这一点

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

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

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

    【讨论】:

    • 我使用的是 PowerShell-v2.0-CTP3,你的例子产生了空集。
    • @alex2k8,不知道在这里说什么。我已经在 1.0 和更高版本的 2.0 版本上尝试过这个示例,都产生了相同的结果。
    • @Jared,这很奇怪。拜托,你能试试 gci -path c:* -in *.我看到了 c:\ 的子文件夹,并且它的所有子文件夹都向下一层。这是类似的描述eggheadcafe.com/software/aspnet/32624832/…
    【解决方案2】:

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

    dir -filter *.txt

    【讨论】:

    • Filter 略有不同,因为它是提供者特定的实现。它通常更有效,因为它发生在数据返回之前。但是对于 PowerShell 中的每个驱动器提供商,它确实有不同的实现。因此,匹配算法可能存在细微差别。
    • 我同意,但在这种情况下,我们谈论的是文件系统提供程序。感谢您的评论。
    【解决方案3】:

    继续JaredPar's answer,为了和Get-ChildItem做模式匹配,你可以使用常用的shell通配符。

    例如:

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

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

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

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

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

    【讨论】:

    • 这里的问题不是只能获得一个扩展名吗? -Include is string[] 允许多个匹配变体。谢谢,本
    【解决方案4】:

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

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

    The Include parameter is effective only when the command includes the
    

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

    所以以下内容可以在没有的情况下工作 递归。

    PS C:\foo> 获取-childitem -path "c:\foo*" - 包括 *.txt

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

    我希望这会有所帮助:-)

    【讨论】:

    • 本,实际上我的问题有点不同。请注意,您的示例将从 foo 文件夹返回 .txt 文件,但它也可能意外返回文件甚至文件夹,例如“c:\foo\dir.txt”目录。试试这样的层次结构:c:\foo\dir.txt\file.txt 和 c:\foo\dir.txt\dir2.txt\file2.txt。你会得到:file.txt 和 dir2.txt!
    【解决方案5】:

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

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

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

    【讨论】:

    • 在路径末尾包含 * 并不总是有效。我知道没有办法指定 -Include 值来匹配没有文件扩展名的文件。将 * 指定为 -Include 模式将匹配此类文件,但会使 Get-ChildItem 递归执行。如果 -Include 的行为方式与 Exclude 相同,那就很容易了。
    【解决方案6】:

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

    【讨论】:

    • 不是,还需要加\*才能生效。
    猜你喜欢
    • 2019-02-17
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 2016-08-13
    • 1970-01-01
    • 1970-01-01
    • 2016-02-14
    • 1970-01-01
    相关资源
    最近更新 更多