![](/img/trans.png)
[英]How to exclude files and folders from Get-ChildItem in PowerShell?
[英]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-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 {
...
}
@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.