2009-04-26 38 views
11

的-Include参数从技术文档:困惑与Get-ChildItem cmdlet的

-Include

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

include参数是有效的,只有当该命令 包括Recurse参数或 路径导致 目录的内容,如C:\视窗*,其中 通配符指定的所述 内容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" 

它不返回任何内容,而不包含我包含的文件夹内容。所以 - 包括绝对是“有效的”。这里真的发生了什么? -Path指定“c:\ test”,并且-Include尝试匹配此路径。由于“* .txt”与“test”不匹配,所以没有返回。但是看看这个:

gci -Path "c:\test" -Include "*t" 

它返回A.TXT,b.txt和c.txt为“* T”匹配“测试”和匹配的所有子项。毕竟,即使知道包括现在的作品,我也不知道何时使用它。为什么我需要它看到子文件夹内?为什么它应该如此复杂?

回答

14

你很困惑使用-include。-include标志应用于路径,而不是路径的内容。如果不使用递归标志,那么所讨论的唯一路径就是您指定的路径。这就是为什么你给出的最后一个例子工作,路径c:\test在路径中有一个t,因此匹配"*t"

您可以尝试以下

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

这仍然会产生所有目录中的孩子们的验证这一点但它没有匹配他们的名字。

之所以-include是递归参数更有效的是,你最终应用通配符对层次结构中的每一个路径。

+0

我正在使用PowerShell-v2.0-CTP3,并且您的示例会生成空集。 – alex2k8 2009-04-26 17:21:02

+0

@ alex2k8,不知道该说些什么。我已经在1.0和2.0以后的版本中试过这个例子,两者都产生了相同的结果。 – JaredPar 2009-04-26 17:25:46

+0

@Jared,这很奇怪。请你可以试试gci -path c:\ * -in *。我看到c:\的子项目,并且所有子文件夹都是一级的。这里是类似的描述http://www.eggheadcafe.com/software/aspnet/32624832/getchilditem-include-qu.aspx – alex2k8 2009-04-26 23:33:56

4

后跟踪到JaredPar's answer,为了做图案的Get-ChildItem匹配,你可以使用普通的外壳通配符。

例如: “?”

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

其中是匹配任何一个字符的通配符或

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

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

这应该得到你所寻找的“简单”的行为。

+0

这里的问题不是你只能得到一个扩展吗? -Include是字符串[],允许多个匹配变体。 谢谢,本 – 2009-09-02 21:29:37

9

尝试筛选参数(它只有一个扩展支持):

DIR型滤波器* .TXT

+5

过滤器稍有不同,因为它是提供程序特定的实现。它通常更高效,因为它在数据返回之前发生。但是它对PowerShell中的每个驱动器提供者都有不同的实现。因此匹配算法可能会有细微的差异。 – JaredPar 2009-04-26 17:59:37

2

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

答案是命令的完整描述 (获取帮助获取-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

从堆栈溢出问题PowerShell Scripting - Get-ChildItem

我希望这有助于:-)

0

在路径的末尾包括\*应该解决的问题

PS C:\logfiles> Get-ChildItem .\* -include *.log 

这应返回。来自当前工作目录的日志文件(C:\logfiles

Alex的上面的示例表明还会返回名称为foo.log的目录。当我尝试它时,它不是,但它是6年后,可能来自PS更新。

但是,您可以使用子项Mode排除我认为的目录。

PS C:\logfiles> Get-Childitem .\* -include *.log | where-object {$_.mode -notmatch "d"} 

这应该排除任何与“目录”模式设置。