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?

Jawaban:


393

Gunakan cmdlet Get-ChildItem dengan -Recursesakelar:

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

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}

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

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

Juga akan bekerja


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

6

Coba ini:

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

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' }

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.