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?
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:
Gunakan cmdlet Get-ChildItem dengan -Recursesakelar:
Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse -ErrorAction SilentlyContinue -Force
cd V:\MyFolderdiikuti olehls -r -inc CopyForBuild.bat
ls -r -ea silentlycontinue -fo -inc "filename.txt" | % { $_.fullname }
*) 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
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}
Get-ChildItem V:\MyFolder -name -recurse *.CopyForbuild.bat
Juga akan bekerja
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 cepatCoba ini:
Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse | Where-Object { $_.Attributes -ne "Directory"}
| Where-Object { !$_PSIsContainer }untuk mengecualikan folder
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' }
'\ACopyForBuild\.(bat|cmd)\Z'?