2016-03-04 201 views
1

如何排除文件夾?現在我硬編碼的文件夾名稱,但我希望它更靈活。Powershell - 排除Get-ChildItem中的文件夾

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

您的意思是排除* all *文件夾嗎?或者只是你選擇的那些? –

回答

4

「如何排除文件夾?」 ,如果你的意思是所有的文件夾:

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

但它只適用於$ fileDirectory的第一級。 這工作recursevly:

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

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

您可以通過使用管道和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 { 
    ... 
    } 
+0

如果我沒有錯,這仍然需要指定要排除的文件夾名稱。示例如果我有100個文件夾,我需要指定它們中的每一個100次。現在我想跳過這個手動過程 – user664481

+0

您需要建立一個文件夾列表來排除這種或那種方式,無論是手動執行還是運行不同的'Get-ChildItem'命令。這取決於您如何選擇要排除的文件夾。 –

0

@dvjz說-file只能在一個文件夾中的第一級,但不遞歸。但它似乎爲我工作。

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