PowerShell kullanarak özyinelemeli dosya arama


238

Tüm klasörlerde bir dosya arıyorum.

Copyforbuild.bat birçok yerde kullanılabilir ve yinelemeli olarak arama yapmak istiyorum.

$File = "V:\Myfolder\**\*.CopyForbuild.bat"

PowerShell'de nasıl yapabilirim?

Yanıtlar:


393

Anahtarla Get-ChildItem cmdlet'ini kullanın -Recurse:

Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse -ErrorAction SilentlyContinue -Force

1
Bir dizinde çalışırsa, erişim izniniz yoksa, işlem çıktığı için tüm aramanın iptal edildiği konusunda bir sorun var gibi görünüyor. Bunun bir yolu var mı?
deed02392

6
ErrorAction parametresini Continue veya SilentlyContinue olarak ayarlamaya çalışın (değerinin belirtildiği gibi olmaması durumunda).
Shay Levy

22
Aynı şeyi yapmanın daha kısa bir yolu: cd V:\MyFolderardındanls -r -inc CopyForBuild.bat
Orion Edwards

8
Yani yukarıdaki yorumcular ne demek ...ls -r -ea silentlycontinue -fo -inc "filename.txt" | % { $_.fullname }
Andrew

Dosya adının *sonuna astrik sembolü ( ) ekleyerek kısmi dize yapmak için bu cevabı uyarladım . ****** $File = "Microsoft.OData.Core.NetFX35.V7*"LINE1 : LINE2: $Folder = "C:\Program Files"LINE3:Get-ChildItem -Path $Folder -Filter $File -Recurse -ErrorAction SilentlyContinue -Force
SherlockSpreadsheets

37

Bu dosyaları bulmak için kullanın ve sonra PowerShell sonuçların tüm yolunu görüntülemek:

dir -Path C:\FolderName -Filter FileName.fileExtension -Recurse | %{$_.FullName}

Joker karakteri her zaman ve / veya *içinde kullanabilirsiniz . Örneğin:FolderNameFileName.fileExtension

dir -Path C:\Folder* -Filter File*.file* -Recurse | %{$_.FullName}

Yukarıdaki örnek, C:\sürücüdeki sözcükle başlayan herhangi bir klasörü arayacaktır Folder. Yani, adında bir klasörünüz varsa FolderFooveFolderBar PowerShell her iki klasörden de sonuçları gösterir.

Aynı şey dosya adı ve dosya uzantısı için de geçerlidir. Belirli bir uzantıya sahip bir dosyayı aramak istiyor ancak dosyanın adını bilmiyorsanız, şunları kullanabilirsiniz:

dir -Path C:\FolderName -Filter *.fileExtension -Recurse | %{$_.FullName}

Ya da tam tersi:

dir -Path C:\FolderName -Filter FileName.* -Recurse | %{$_.FullName}

4
Bu cevabı son derece kullanışlı buluyorum çünkü belirli bir kullanım durumunu ele alıyor - aslında aradığınız dosyayı kullanmak istiyor. | dosyanın tam adını vermek için diğer cevaplarda eksik bir şeydir.
Newteq Developer

1
Burada @ Sanity1123 ile anlaşmak zorundayım, eğer gerçekten dosyayı kullanmak istiyorsanız, dosyanın tam yoluna ihtiyacınız olacak. IMHO bu kabul edilen cevap olmalı.
uceumern

31

Güvenliğe dayalı bir hata alabileceğiniz klasörleri ararken (örn. C:\Users), Aşağıdaki komutu kullanın:

Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse -ErrorAction SilentlyContinue -Force

12
Get-ChildItem V:\MyFolder -name -recurse *.CopyForbuild.bat

Ayrıca çalışacak


Ve sonuçları bir dosyaya çıktılamak istiyorsanız, komutun sonuna `> path_to_filename.txt` ekleyebilirsiniz.
Gwen Au

7

İşte sonunda mücadele ettikten sonra bulduğum yöntem:

Get-ChildItem -Recurse -Path path/with/wildc*rds/ -Include file.*

Çıktıyı daha temiz (yalnızca yol) yapmak için şunu kullanın:

(Get-ChildItem -Recurse -Path path/with/wildc*rds/ -Include file.*).fullname

Yalnızca ilk sonucu almak için şunu kullanın:

(Get-ChildItem -Recurse -Path path/with/wildc*rds/ -Include file.*).fullname | Select -First 1

Şimdi önemli şeyler için:

Dosyalar için yalnızca aramak için / dizinleri yok değil kullanmak -Fileveya -Directory(neden aşağıya bakınız). Bunun yerine dosyalar için kullanın:

Get-ChildItem -Recurse -Path ./path*/ -Include name* | where {$_.PSIsContainer -eq $false}

ve -eq $falsedizinleri kaldırın . Do not gibi sondaki joker bırakın bin/*.

Neden yerleşik anahtarları kullanmıyorsunuz? Onlar korkunç ve rastgele özellikleri kaldırmak. Örneğin, -Includebir dosyayla kullanmak için yolu bir joker karakterle sonlandırmanız gerekir. Ancak, bu -Recursesize söylemeden anahtarı devre dışı bırakır :

Get-ChildItem -File -Recurse -Path ./bin/* -Include *.lib

Bunun *.libtüm alt dizinlerde size vereceğini düşünürsünüz , ancak yalnızca en üst düzeyde arama yapar bin.

Dizin aramak için kullanabilirsiniz -Directory, ancak sondaki joker karakteri kaldırmanız gerekir. Hangi nedenle olursa olsun, bu devre dışı bırakılmaz -Recurse. Bu nedenlerden dolayı yerleşik bayrakları kullanmamanızı tavsiye ederim.

Bu komutu önemli ölçüde kısaltabilirsiniz:

Get-ChildItem -Recurse -Path ./path*/ -Include name* | where {$_.PSIsContainer -eq $false}

olur

gci './path*/' -s -Include 'name*' | where {$_.PSIsContainer -eq $false}
  • Get-ChildItem ile takma gci
  • -Path varsayılan 0 konumuna ayarlandığından, ilk bağımsız değişken yolunu oluşturabilirsiniz
  • -Recurse ile takma -s
  • -Include stenografi yok
  • Tüm komutu çift tırnak işaretleri içine alabilmeniz ve Komut İstemi'nde kullanabilmeniz için adlarda / yollardaki boşluklar için tek tırnak kullanın. Bunu başka şekilde yapmak (tek tırnak işareti ile surround) hatalara neden olur

6

Bunu dene:

Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse | Where-Object { $_.Attributes -ne "Directory"}

2
| Where-Object { !$_PSIsContainer }Klasörleri hariç tutmak için de kullanabilirsiniz
Gargravarr

5

Joker karakterler kullanarak filtreleme:

Get-ChildItem -Filter CopyForBuild* -Include *.bat,*.cmd -Exclude *.old.cmd,*.old.bat -Recurse

Normal bir ifade kullanarak filtreleme:

Get-ChildItem -Path "V:\Myfolder" -Recurse
| Where-Object { $_.Name -match '\ACopyForBuild\.[(bat)|(cmd)]\Z' }

1
Olmamalı mı '\ACopyForBuild\.(bat|cmd)\Z'?
E. Sundin

1

@ User3303020 yanıtına eklemek ve arama sonuçlarını bir dosyaya çıkarmak için,

Get-ChildItem V:\MyFolder -name -recurse *.CopyForbuild.bat > path_to_results_filename.txt

Doğru dosyayı bu şekilde aramak daha kolay olabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.