繁体   English   中英

Powershell - 排除 Get-ChildItem 中的文件夹

[英]Powershell - Exclude folders in Get-ChildItem

如何排除文件夹? 现在我对文件夹名称进行了硬编码,但我希望它更灵活。

foreach($file in Get-ChildItem $fileDirectory -Exclude folderA,folderb)

“如何排除文件夹?” ,如果您的意思是所有文件夹:

get-childitem "$fileDirectory\\*" -file 

但它仅适用于 $fileDirectory 的第一级。 这递归地工作:

Get-ChildItem "$fileDirectory\\*"  -Recurse | ForEach-Object { if (!($_.PSIsContainer)) { $_}}

或者

 Get-ChildItem "$fileDirectory\\*"  -Recurse | where { !$_.PSisContainer }

您可以通过使用管道和Where-Object过滤器来执行此操作。

首先,在 PowerShell 中迭代一组文件的惯用方法是通过管道将Get-ChilditemForeach-Object 所以重写你的命令得到:

Get-ChildItem $fileDirectory | foreach {
   $file = $_
   ...
}

使用管道的优点是现在您可以在它们之间插入其他 cmdlet。 具体来说,我们使用Where-Object来过滤文件列表。 仅当文件不包含在给定数组中时,过滤器才会传递文件。

$excludelist = 'folderA', 'folderB'
Get-Childitem $fileDirectory | 
  where { $excludeList -notcontains $_ } |
  foreach {
    $file = $_
    ...
  }

如果您要大量使用它,您甚至可以编写一个自定义过滤器函数,在传递给foreach之前以任意方式修改文件列表。

filter except($except, $unless = @()) {
  if ($except -notcontains $_ -or $unless -contains $_ ){
    $_ 
  }
}

$excludelist = 'folderA', 'folderB'
$alwaysInclude = 'folderC', 'folderD'
Get-ChildItem $fileDirectory |
  except $excludeList -unless $alwaysInclude | 
  foreach {
    ...
  }

@dvjz 说 -file 仅适用于文件夹的第一级,但不能递归。 但它似乎对我有用。

get-childitem "$fileDirectory\\*" -file -recurse

递归排除文件夹的最简单方法:

foreach($file in Get-ChildItem $fileDirectory -Exclude {**Get-ChildItem folderA**},{**Get-ChildItem folderb**})

对于未来的谷歌员工,我发现文件有一个名为PSIsContainer的属性,当它们是目录时为$true 列出$fileDirectory所有文件的命令将是:

foreach ($file in Get-ChildItem $fileDirectory | Where-Object -Property PSIsContainer -eq $false)
{
    Write-Host $file.Name
}

请注意, -Property对于 cmdlet Where-Object是可选的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM