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

Filtering child folders with Get-ChildItem -Exclude using a dynamically constructed array of exclusion patterns

我在 "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 

试试这个:

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

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

此代码适用于我的电脑

$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
  • 我们现在知道您的主要问题$ExcludeArray内容,您的动态构建字符串数组(排除模式),其元素错误地具有 embedded " 个字符。 (例如,"Arizona" 而不仅仅是 Arizona)或者,$ExcludeArray 可能错误地包含了一个多行字符串而不是数组。

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

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

  • 使用正确构造的数组,您的原始命令 确实 有效,但 如果 [ $ExcludeArray 中模式的 =115=] 匹配 输入路径 - Client 最后一个组件 ,在此case.

    • 换句话说:-Exclude-Include 可能出乎意料地与 输入路径 的最后一个路径组件(如果是文件路径,则为文件名,如果是目录路径,则为目录名)。

    • Get-ChildItem 的情况下,与 parent 目录名称的匹配发生在 before child 项(目录 inside 的项)的名称匹配,如果父项不匹配,则子项不匹配连看都没输出

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

因此,最好找到一个通常健壮的惯用语来解决您的问题,其中避免了与父目录名称的匹配

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

具体来说:

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

相比之下,如果您附加 \* 但坚持使用 Get-*Child*Item,如 ,您的命令将表现不同:您将获得 内容 未排除的任何子目录的(子项),而不是 目录本身