ディレクトリパターンを再帰的に除外できません


30

フォルダーの子アイテムを再帰的に取得しようとしています。ただし、フォルダーにはノイズファイルとフォルダーが含まれます(実際には、これはVisual Studioプロジェクトフォルダーです)。

ここに私が持っているもの:

$root = Get-Item C:\Projects\MyProject

$allItems =  Get-ChildItem $root -Recurse -exclude "**\pkgobj\*"

ただし、$allItemsパスに一致するファイルとフォルダーはまだ含まれています。

私が間違ったことは何ですか?

より正確には、フォルダーとファイルの両方を取得しますが、指定したフォルダーとその子孫は取得しません。

私も試しました:

foreach($item in $allItems){
    if($item.FullName -notmatch "pkgobj") {
        Write-Host -ForegroundColor Green $item.FullName.Replace($root,'')

    }
}

しかし、これ以上成功しない

回答:


44

問題を理解するために少し時間がかかりました。そのトリッキーなもの。

-excludeアイテムのベース名(つまりmyfile.txt)にのみ適用され、必要なフルネーム
(つまりC:\pkgobj\myfile.txt)には適用されません。したがってここでexcludeを使用することはできません。

しかし、を使用Fullnameして回避策があります-notlike

$root = "C:\Projects\MyProject"
$allitems = Get-ChildItem $root -Recurse | Where {$_.FullName -notlike "*\pkgobj\*"} 

1
ただし、パフォーマンスのために大きなノード(node_modulesなど)を除外したい場合、再帰的にすべてをチェックし、その後フィルター処理するため、これは役に立ちません。
Pluc

これはどうですか ?Get-ChildItem-exclude_dirを除外します| foreach {Get-ChildItem -Path $ _ -Include * .include -Recurse -Exclude * .excludefile | foreach {echo $ _}}
NN_
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.