使用Get-ChildItem -Exclude或-Include不返回任何内容

时间:2016-07-08 14:31:10

标签: powershell powershell-v4.0

我的C:目录中有一个包含许多文件的列表。如果我尝试在其上运行-Exclude,则不会返回。与-Include相同。如果我使用过滤器,它会返回我期望的结果。我不明白它应该做什么?

以下是我正在运行并一无所获的示例:

Get-ChildItem -Path C: -Exclude "*.txt"

我一无所获。如果我跑

Get-Childitem -filter "*.txt"

我得到了回复:

  Mode                LastWriteTime         Length Name                                                                               
----                -------------         ------ ----                                                                               
-a----        11/7/2007   8:00 AM          17734 eula.1028.txt                                                                      
-a----        11/7/2007   8:00 AM          17734 eula.1031.txt                                                                      
-a----        11/7/2007   8:00 AM          10134 eula.1033.txt                                                                      
-a----        11/7/2007   8:00 AM          17734 eula.1036.txt                                                                      
-a----        11/7/2007   8:00 AM          17734 eula.1040.txt                                                                      
-a----        11/7/2007   8:00 AM            118 eula.1041.txt                                                                      
-a----        11/7/2007   8:00 AM          17734 eula.1042.txt                                                                      
-a----        11/7/2007   8:00 AM          17734 eula.2052.txt                                                                      
-a----        11/7/2007   8:00 AM          17734 eula.3082.txt                                                                      
               7/7/2016   8:50 AM             93 HaxLogs.txt                                                                        
-a----         7/8/2016   8:30 AM              0 Test.txt 

4 个答案:

答案 0 :(得分:11)

总结并补充gravity'sBrian Reynolds's有用的答案:

您的方法存在两个明显的问题:

  • 定位C:可能不会(总是)按照您的意愿行事,因为 C:指的是恰好是当前位置(工作目录。)在驱动器C:此刻。

    • 要定位驱动器C:的根文件夹,您必须使用C:\,我将假设您在本答复的其余部分中的含义。
  • 使用 -Exclude(以及-Include)参数时,-Recurse-Path值都不会以\*结尾没有结果。意外?确实 - 见下文了解更多。

    • 因此,Get-Item -Path C:\* -Exclude *.txt - 请注意从Get-ChildItem切换到Get-Item*之后的C:\ - 需要让您的命令适用于这些项目仅在C:\直接

背景资料:

使用提供者原生-Filter参数通常比-Include 更受欢迎,因为:

  • 它比-Include快得多,因为提供商本身在源上执行过滤,而不是让PowerShell稍后应用过滤器 >,收到所有对象后。

  • 它不需要您切换到Get-Item并将\*附加到-Path参数值。

    • Get-ChildItem -Path C:\ -Filter *.txt可以很好地匹配C:的根目录中的所有*.txt个文件。

那就是说,警告

  • -Filter支持的通配符模式语言功能少于PowerShell,可能会出乎意料地匹配短(8.3)文件名 - 请参阅this well-researched answer了解详细信息。

  • -Filter仅支持单个模式,而-Include支持多个模式(模式的数组)。

不幸的是, -Filter始终是正面(包含)过滤器,因此无法用于提供-Exclude的功能。

-Include / -ExcludeGet-ChildItem的实施不直观且存在缺陷:

旁注:如果您只使用一个 -Include模式(而不是-Exclude),则更容易追加直接模式到-Path参数;例如:Get-ChildItem C:\*.txt

tl; dr :要使用-Include / -Exclude获取可预测的行为,请使用Get-Item C:\path\to\*(请注意附加的\*以及Get-*Child*Item) - 除非您还使用-Recurse

  • -Include-Exclude无法按照人们的直觉预期

    • -Include-Exclude修改-Path参数的 leaf (last)路径组件。

    • 这意味着模式将首先应用于文件夹路径本身 的叶子组件 子项目,如果有的话。

    • 如果输入路径未在\*中结束且未指定-Recurse,则其含义如下:

      • -Include:如果输入路径的最后路径组件匹配-Include模式,则输入路径本身被排除(不包括在内),并且从不查看路径的项 - 不输出任何内容。

      • -Exclude:类似地,如果输入路径的最后路径组件 匹配-Exclude模式,则输入路径本身被排除在外,并且永远不会查看路径的项 - 不输出任何内容。

        • 在路径C:\Get-ChildItem -Path C:\ -Exclude <any-pattern>)的特殊情况下,可以说最后一个路径组件是空字符串,似乎任何排除模式被认为是匹配,并且不会产生任何输出。
    • 如上所述,如果使用-Recurse,问题就不会出现,因为强制降序到输入路径的子树中,即使输入路径本身不包含在内/排除。

  • 除非需要-Recurse,否则获得预期行为的唯一方法是替换
    Get-ChildItem C:\path\to -Include / -Exclude
    Get-Item C:\path\to\* -Include / -Exclude - 请注意使用 Get-Item 而不是Get-ChildItem,并附加 \* < / em>到-Path参数。

    • 相比之下,如果您在匹配项中使用Get-ChildItem并且目录Get-ChildItem将输出其内容
  • 使用-LiteralPath 而不是-Path -Include-Exclude 被悄悄忽略 - 它们没有任何效果。

示例:-Include / -Exclude

的问题用法

注意:要使下面的所有命令都能直观地工作,请将Get-ChildItem C:\Windows替换为Get-Item C:\Windows\* - 请注意使用不同的cmdlet Get-Item和附加的{{1} }}

\*

答案 1 :(得分:6)

Get-ChildItem -Path "C:\*" -Include "*.txt"

-Include应如何工作的示例将为您提供您期望的结果。请注意,我在path参数中也提供了一个通配符,以明确地将路径定义为&#34;根C中的任何文件:&#34;而不是&#34; C:&#34;本身。

来源: https://technet.microsoft.com/library/hh849800.aspx

来自此链接的示例3,如果它已失效(请注意此处路径中的通配符):

C:\> Get-ChildItem –Path "C:\Windows\Logs\*" -Include "*.txt" -Exclude "A*"

答案 2 :(得分:1)

使用'C:'后没有斜线,这是你没有得到你想要的结果的原因。这被解释为当前目录的相对路径,而不是C驱动器的根目录。 (见:Path with no slash after drive letter and colon - what does it point to?

如果您使用'C:\',它应该按预期工作。

编辑:我的错误;我专门回答了只使用'-exclude'的例子。

答案 3 :(得分:0)

这似乎是一个错误(因为父属性的字符串版本为空字符串?)。使用子目录,它可以正常工作:

get-childitem c:\windows -directory -exclude *.dll

您可以用其他方式指定根目录,并得到一条奇怪的错误消息:

get-childitem Microsoft.PowerShell.Core\FileSystem::C:\ -exclude *.txt

get-childitem : Cannot process argument because the value of argument "path" is not valid. Change the value of the "path" argument and run the operation again.
At line:1 char:1
+ get-childitem Microsoft.PowerShell.Core\FileSystem::C:\ -exclude wind ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Get-ChildItem], PSArgumentException
    + FullyQualifiedErrorId : Argument,Microsoft.PowerShell.Commands.GetChildItemCommand

或者,在osx中​​:

get-childitem / -directory -exclude *.txt

get-childitem : Cannot process argument because the value of argument "path" is not valid. Change the value of the "path" argument and run the operation again.
At line:1 char:1
+ get-childitem / -directory -exclude var
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : InvalidArgument: (:) [Get-ChildItem], PSArgumentException
+ FullyQualifiedErrorId : Argument,Microsoft.PowerShell.Commands.GetChildItemCommand

这是Powershell 6及更高版本的解决方法:

get-item c:\ | get-childitem -exclude *.txt