我的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
答案 0 :(得分:11)
总结并补充gravity's和Brian Reynolds's有用的答案:
您的方法存在两个明显的问题:
定位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
/ -Exclude
与Get-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