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

50few1ms  于 2022-11-10  发布在  Shell
关注(0)|答案(5)|浏览(221)

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

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

7kjnsjlb1#

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

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

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

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

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

f5emj3cl2#

您可以通过使用管道和Where-Object过滤器来实现这一点。
首先,在PowerShell中迭代一组文件的惯用方法是通过管道将Get-Childitem传递给Foreach-Object。因此,重写命令会得到以下结果:

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

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

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

如果您要经常使用它,您甚至可以编写一个定制的Filter函数,在传递给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 {
    ...
  }
kuhbmx9i

kuhbmx9i3#

@dvjz说,-file只在文件夹的第一级工作,不能递归工作。但它似乎对我很管用。

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

cwdobuhd4#

对于未来的Googler,我发现文件有一个名为PSIsContainer的属性,当它们是一个目录时,它就是$true。列出$fileDirectory中所有文件的命令为:

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

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

oxcyiej7

oxcyiej75#

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

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

在哪里:

  • $fileDirectory-搜索文件夹
  • folderAfolderB-排除的文件夹

相关问题