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

use*_*481 3 powershell

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

foreach($file in Get-ChildItem $fileDirectory -Exclude folderA,folderb)
Run Code Online (Sandbox Code Playgroud)

Rya*_*ose 6

您可以使用管道和Where-Object过滤器来完成此操作.

首先,遍历一组在PowerShell中的文件的惯用方式是管Get-Childitem到Foreach-Object.所以重写你的命令得到:

Get-ChildItem $fileDirectory | foreach {
   $file = $_
   ...
}
Run Code Online (Sandbox Code Playgroud)

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

$excludelist = 'folderA', 'folderB'
Get-Childitem $fileDirectory | 
  where { $excludeList -notcontains $_ } |
  foreach {
    $file = $_
    ...
  }
Run Code Online (Sandbox Code Playgroud)

如果你要经常使用它,你甚至可以编写一个自定义过滤器函数来在传递之前以任意方式修改文件列表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 {
    ...
  }
Run Code Online (Sandbox Code Playgroud)


dvj*_*vjz 6

"如何排除文件夹?" ,如果你的意思是所有文件夹:

get-childitem "$fileDirectory\\*" -file 
Run Code Online (Sandbox Code Playgroud)

但它只适用于$ fileDirectory的第一级.这工作recursevly:

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

要么

 Get-ChildItem "$fileDirectory\\*"  -Recurse | where { !$_.PSisContainer }
Run Code Online (Sandbox Code Playgroud)