Pencarian file rekursif menggunakan PowerShell

238

Saya mencari file di semua folder.

Copyforbuild.bat tersedia di banyak tempat, dan saya ingin mencari secara rekursif.

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

Bagaimana saya bisa melakukannya di PowerShell?

Samselvaprabu
sumber

Jawaban:

393

Gunakan cmdlet Get-ChildItem dengan -Recursesakelar:

Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse -ErrorAction SilentlyContinue -Force
Shay Levy
sumber
1
Tampaknya memiliki masalah bahwa jika berjalan ke direktori Anda tidak memiliki izin untuk mengakses, seluruh pencarian dibatalkan karena proses keluar. Apakah ada jalan keluarnya?
deed02392
6
Coba atur parameter ErrorAction ke Continue atau SilentlyContinue (seandainya nilainya tidak seperti yang disebutkan).
Shay Levy
22
Cara yang lebih singkat untuk melakukan hal yang persis sama: cd V:\MyFolderdiikuti olehls -r -inc CopyForBuild.bat
Orion Edwards
8
Jadi maksud para komentator di atas adalah ...ls -r -ea silentlycontinue -fo -inc "filename.txt" | % { $_.fullname }
Andrew
Saya mengadaptasi jawaban ini untuk melakukan sebagian string dengan menambahkan simbol astrik ( *) ke akhir nama file. ****** LINE1: $File = "Microsoft.OData.Core.NetFX35.V7*"LINE2: $Folder = "C:\Program Files"LINE3:Get-ChildItem -Path $Folder -Filter $File -Recurse -ErrorAction SilentlyContinue -Force
SherlockSpreadsheets
37

Saya menggunakan ini untuk menemukan file dan kemudian memiliki PowerShell menampilkan seluruh jalur hasil:

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

Anda selalu dapat menggunakan wildcard *di FolderNamedan / atau FileName.fileExtension. Sebagai contoh:

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

Contoh di atas akan mencari folder apa pun di C:\drive yang dimulai dengan kata Folder. Jadi jika Anda memiliki folder bernama FolderFoodan FolderBarPowerShell akan menampilkan hasil dari kedua folder tersebut.

Hal yang sama berlaku untuk nama file dan ekstensi file. Jika Anda ingin mencari file dengan ekstensi tertentu, tetapi tidak tahu nama file, Anda dapat menggunakan:

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

Atau sebaliknya:

dir -Path C:\FolderName -Filter FileName.* -Recurse | %{$_.FullName}
BinaryJoe01
sumber
4
Saya menemukan jawaban ini sangat berguna karena membahas kasus penggunaan tertentu - sebenarnya ingin menggunakan file yang Anda cari. The | untuk memberi Anda nama lengkap file adalah sesuatu yang hilang di jawaban lain.
Pengembang Newteq
1
Saya harus setuju dengan @ Sanity1123 di sini, jika Anda benar-benar ingin menggunakan file tersebut, Anda akan memerlukan path lengkap ke file tersebut. IMHO ini harus menjadi jawaban yang diterima.
uceumern
31

Saat mencari folder di mana Anda mungkin mendapatkan kesalahan berdasarkan keamanan (misalnya C:\Users), gunakan perintah berikut:

Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse -ErrorAction SilentlyContinue -Force
Mötz
sumber
12
Get-ChildItem V:\MyFolder -name -recurse *.CopyForbuild.bat

Juga akan bekerja

pengguna3303020
sumber
Dan jika Anda ingin menampilkan hasil ke file, Anda dapat menambahkan `> path_to_filename.txt` di akhir perintah.
Gwen Au
7

Inilah metode yang akhirnya saya dapatkan setelah berjuang:

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

Untuk membuat pembersih output (hanya jalur), gunakan:

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

Untuk mendapatkan hanya hasil pertama, gunakan:

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

Sekarang untuk hal-hal penting:

Untuk mencari hanya untuk file / direktori yang tidak menggunakan -Fileatau -Directory(lihat di bawah mengapa). Alih-alih gunakan ini untuk file:

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

dan hapus -eq $falsedirektori untuk. Jangan tidak meninggalkan wildcard tertinggal seperti bin/*.

Mengapa tidak menggunakan sakelar bawaan? Mereka mengerikan dan menghapus fitur secara acak. Misalnya, untuk dapat menggunakan -Includefile, Anda harus mengakhiri path dengan wildcard. Namun, ini menonaktifkan -Recursesakelar tanpa memberi tahu Anda:

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

Anda akan berpikir itu akan memberi Anda semua *.libdi semua subdirektori, tetapi hanya akan mencari tingkat atas bin.

Untuk mencari direktori, Anda dapat menggunakan -Directory, tetapi kemudian Anda harus menghapus wildcard trailing. Untuk alasan apa pun, ini tidak akan dinonaktifkan -Recurse. Karena alasan inilah saya merekomendasikan untuk tidak menggunakan flag bawaan.

Anda dapat mempersingkat perintah ini secara signifikan:

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

menjadi

gci './path*/' -s -Include 'name*' | where {$_.PSIsContainer -eq $false}
  • Get-ChildItem alias gci
  • -Path default ke posisi 0, jadi Anda bisa membuat jalur argumen pertama
  • -Recurse alias -s
  • -Include tidak memiliki tulisan cepat
  • Gunakan tanda kutip tunggal untuk spasi dalam nama / jalur, sehingga Anda dapat mengelilingi seluruh perintah dengan tanda kutip ganda dan menggunakannya dalam Command Prompt. Melakukannya sebaliknya (dikelilingi dengan tanda kutip tunggal) menyebabkan kesalahan
hlk
sumber
6

Coba ini:

Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse | Where-Object { $_.Attributes -ne "Directory"}
Tujuh kali
sumber
2
Anda juga dapat menggunakan | Where-Object { !$_PSIsContainer }untuk mengecualikan folder
Gargravarr
5

Filter menggunakan wildcard:

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

Pemfilteran menggunakan ekspresi reguler:

Get-ChildItem -Path "V:\Myfolder" -Recurse
| Where-Object { $_.Name -match '\ACopyForBuild\.[(bat)|(cmd)]\Z' }
MovGP0
sumber
1
Bukankah seharusnya begitu '\ACopyForBuild\.(bat|cmd)\Z'?
E. Sundin
1

Untuk menambahkan ke @ user3303020 jawab dan hasilkan output pencarian ke file, Anda dapat menjalankan

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

Mungkin lebih mudah untuk mencari file yang benar seperti itu.

Gwen Au
sumber