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

时间:2016-03-04 06:59:15

标签: powershell

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

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

5 个答案:

答案 0 :(得分:6)

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

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

但它仅适用于$ fileDirectory的第一级。 这很有效:

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

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

答案 1 :(得分:5)

您可以使用管道和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 = $_
    ...
  }

如果您要经常使用它,您甚至可以编写自定义过滤器函数,以便在传递给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 {
    ...
  }

答案 2 :(得分:1)

递归排除文件夹的最巧妙方法:

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

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

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