使用Get-ChildItem过滤子文件夹-Exclude使用动态构造的排除模式数组

时间:2017-03-27 16:36:04

标签: powershell powershell-v2.0 subdirectory get-childitem glob

我在“clients”目录中有以下文件夹

Arizona
California
Connecticut
Default
Delaware
Florida
Hawaii
Idaho
Iowa
Maine

我有一个数组,它有以下项目:

Write-Host "Printing the array " 
$ExcludeArray

Output----
"Arizona",
"California"  

我正在尝试列出C:\Users\santhu\Desktop\Clients中的文件夹,并使用以下命令排除$ExcludeArray数组中的文件夹。

Get-Childitem C:\Users\santhu\Desktop\Clients -Force -Exclude $ExcludeArray

似乎排除不按预期工作。我相信原因可能是$ExcludeArray中的项目不在同一行。如果有任何方法可以将它们转换为同一行并过滤文件夹,有人可以建议我吗? 仅供参考:$ExcludeArray项不是静态的。我写不出像$ExcludeArray = "Arizona","California"这样的东西。我期待以下输出。

Mode                LastWriteTime     Length Name                                                                       
----                -------------     ------ ----                                                                                                                                                                                                       
d----         3/20/2017  12:15 PM            Connecticut                                                                
d----         3/20/2017  12:15 PM            Default                                                                    
d----         3/20/2017  12:15 PM            Delaware                                                                   
d----         3/20/2017  12:15 PM            Florida                                                                    
d----         3/20/2017  12:15 PM            Hawaii                                                                     
d----         3/20/2017  12:15 PM            Idaho                                                                      
d----         3/20/2017  12:15 PM            Iowa                                                                       
d----         3/20/2017  12:15 PM            Maine                                                                      
d----         3/20/2017  12:15 PM            Minnesota 

3 个答案:

答案 0 :(得分:1)

试试这个:

Get-Childitem C:\Users\santhu\Desktop\Clients\* -Force -Exclude $ExcludeArray

排除和包含开关在这里有点棘手。它适用于最后提到的路径。所以通配符应该做你的工作。确保数组中没有任何双引号。

答案 1 :(得分:1)

  • 我们现在知道您的主要问题是{strong>内容$ExcludeArray ,您动态构建的字符串数组(排除模式),其元素要么错误地使用嵌入 "字符。 (例如,"Arizona"而不仅仅是Arizona)或者,$ExcludeArray错误地包含单个多行字符串而不是数组。

    • 要将文件中的行读入字符串数组的元素,只需$ExcludeArray = Get-Content file

    • 如果文件的行包含"个字符括起来的字符串。可能以,终止(例如,"Arizona","California",您需要修剪这些字符:
      $ExcludeArray = (Get-Content File) -replace '^"(.*)",?', '$1'

  • 使用正确构造的数组,您的原始命令 可以正常工作,但如果$ExcludeArray中的所有模式都不匹配 在这种情况下,输入路径的最后一个组件 - Client

    • 换句话说:-Exclude-Include可能意外地与输入路径的最后一个路径组件(文件中的文件名)进行比较path,目录路径中的目录名称。)

    • 对于Get-ChildItem,与目录名匹配的 >项目(目录中 目录中的项目)匹配,如果父项不匹配,则甚至不查看子项目,也不输出任何项目。

    • 我的
    • This answer更详细地解释了这种不直观的行为。

因此,最好找到解决问题的通常很健壮的习惯用法,避免匹配父目录的名称

  • Get-ChildItem切换到Get-Item
  • \*附加到您的输入路径。

具体做法是:

Get-Item C:\Users\santhu\Desktop\Clients\* -Force -Exclude $ExcludeArray

相比之下,如果你追加\*但坚持Get-*Child*Item,就像Ranadip Dutta's answer一样,你的命令会有不同的表现:你会得到内容 (子项目)未排除的任何子目录,而不是目录本身

答案 2 :(得分:0)

此代码在我的电脑上运行

$ExcludeArray="Arizona","California"
Get-ChildItem "C:\Users\santhu\Desktop\Clients" -Exclude $ExcludeArray

或者像这样

$ExcludeArray="Arizona","California"
Get-ChildItem "C:\Users\santhu\Desktop\Clients" | where Name -notin $ExcludeArray