【问题标题】:Filtering child folders with Get-ChildItem -Exclude using a dynamically constructed array of exclusion patterns使用 Get-ChildItem -Exclude 过滤子文件夹,使用动态构造的排除模式数组
【发布时间】:2017-03-28 21:56:36
【问题描述】:

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

【问题讨论】:

  • -Recurse 也应该为此工作。

标签: powershell powershell-2.0 subdirectory get-childitem glob


【解决方案1】:

试试这个:

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

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

【讨论】:

  • 删除数组内的双引号有效。谢谢。
  • 很高兴听到这个消息
  • 我最初也认为这也是解决方案,但这将输出非排除目录的内容,而不是目录本身。
【解决方案2】:
  • 我们现在知道您的主要问题$ExcludeArray 的内容,您的动态构造的字符串数组(排除模式),其元素要么错误地具有 嵌入 " 字符。 (例如,"Arizona" 而不仅仅是 Arizona)或者,$ExcludeArray 可能错误地包含单个多行字符串而不是数组。

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

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

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

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

    • 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,您的命令将表现不同:您将获得任何内容(子项)未排除的子目录,而不是目录本身

【讨论】:

  • @mklement0- 首先非常感谢您的回复。我同意。我也会试试这个。
  • @mahesh:我的荣幸;我觉得我需要发布自己的答案,因为 Ranadip 的答案错误地解决了另一个问题。
【解决方案3】:

这段代码可以在我的电脑上运行

$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

【讨论】:

  • 第一个命令发生可以工作在这种情况下,但通常不是很健壮 - 考虑使用 Get-ChildItem C:\Windows -Exclude W* 时会发生什么 - 如果有的排除模式恰好与 parent 目录的名称匹配,您根本没有得到任何结果。除了使用 PSv3+ 语法之外,第二个命令是一个可行的替代方案,尽管比(强大的)基于-Exclude 的解决方案慢。
猜你喜欢
  • 1970-01-01
  • 2013-02-24
  • 2013-11-19
  • 2013-11-19
  • 1970-01-01
  • 2017-01-01
  • 1970-01-01
  • 2020-06-17
  • 1970-01-01
相关资源
最近更新 更多