2015-03-11 12 views
6

Unable to exclude directory using Get-ChildItem -Exclude parameter in Powershell ve How can I exclude multiple folders using Get-ChildItem -exclude? numaralı telefonlara baktığımı söyleyerek başlayayım. Bunların hiçbiri benim problemimi çözen bir cevaba sahip değil.Get-ChildItem'in belirli bir dizini geçmesini nasıl önleyebilirim?

Belirli bir uzantıya sahip dosyalar için bir dizini yinelemeli olarak aramalıyım. Basitlik için, sadece *.txt'u bulmam gerektiğini söyleyelim. Normal olarak, bu komut yeterli olacaktır: Büyük bir sorunum var. C:\mysearchdir\ içinde bir yere gömülmüş node_modules dizini ve NPM son derece derin iç içe dizinler oluşturur. (Bu derinlik benim kontrolü dışında olduğu anlamına gelir çünkü bir NPM yönetilen dizin olma detay sadece önemlidir.) Bu aşağıdaki hatası:

Get-ChildItem : The specified path, file name, or both are too long. The fully qualified file name must be less than 260 characters, and the directory name must be less than 248 characters. 

Bu hata sınırlamalar kadar baloncuk inanıyoruz. NET IO kütüphaneleri.

Çevrede bulunan diğer dizinlerde çok fazla arama yapamıyorum. Bu dizinin en üstünde değil; C:\mysearchdir\dir1\dir2\dir3\node_modules numaralı telefondan daha derinde ve bu seviyelerde arama yapmam gereken dizinler var. Bu yüzden, etrafındaki diğer dizinleri aramak, daha fazla dosya ve dizin eklendiğinden hantal ve çok bakımlı olmayacaktır.

-Exclude parametresini herhangi bir işlem yapmadan denedim. just read'dan beri -Exclude'un yalnızca sonuçların getirilmesinden sonra uygulanmasından bu şaşırtıcı değil. -Filter'u kullanarak gerçek bir bilgi bulamıyorum (this answer numaralı belgede belirtildiği gibi).

Çalışmak için Get-ChildItem alabileceğim herhangi bir yol var mı, yoksa kendi yinelemeli geçişimi mi yazdım?

$Source = 'S:\Prod' 
$Exclude = @('S:\Prod\Dir 1', 'S:\Prod\Dir 2') 

Get-ChildItem -LiteralPath $Source -Directory -Recurse -PipelineVariable Dir -EV e -EA SilentlyContinue | 
    Where {($Exclude | Where {($Dir.FullName -eq "$_") -or ($Dir.FullName -like "$_\*")}).count -eq 0} 
+1

Bu yardımcı olacaktır, [powershell-dosya-yolu-çok uzun] (http://quickbytesstuff.blogspot.de/2014/05/powershell-file-path-too-long.html), bir System.IO –

+0

yerine üçüncü taraf kitaplığı PowerShell'de [bu özyinelemeli model] (http://stackoverflow.com/a/929277/712649) uygulayabilir ve ad "node_modules" ise dizini yok saymak için bir koşul ekleyebilirsiniz. –

+0

Downvoter, iyileştirme önerileri sunabilir mi? – jpmc26

cevap

1

Belki böyle bir şey deneyebilirsiniz. Seninle aynı problemle yüzleşiyordum. Ben, "-EA SilentlyContinue" bölümüne gittiğimde, onu çözümlemeye çalışırken, DarkLite1'in cevabı ile çalışıyordum.

FACEPALM

facepalm!

Tek ihtiyacınız olan bu!

Bu benim için çalıştı

, denemek:

Get-ChildItem -Path 'C:\mysearchdir\' -Filter '*.txt' -Recurse -ErrorAction SilentlyContinue 

Not: Bu değil sadece uzun yolları geçerek oluşturulan hataları gizlemek, bir aramadan node_modules hariç tutar. Tamamen hariç tutmanız gerekiyorsa, daha karmaşık bir çözüme ihtiyacınız olacak.

+1

Bu oldukça karmaşık bir komuttur. Ne yaptığını tarif edebilir misin? – jpmc26

5

Dostum, ben aptal hissediyorum:

+0

+1 Basit SilentlyContinue bunu çözdüğünde, bu soruyu her türlü "Klasör yollarına harfleri yönlendir" tipi çözümleri ile çözmeye çalışan pek çok ileti var. Facepalm gerçekten. – Casey

İlgili konular