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 -Recurse
sakelar:
Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse -ErrorAction SilentlyContinue -Force
cd V:\MyFolder
diikuti 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 FolderName
dan / 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 FolderFoo
dan FolderBar
PowerShell 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 -File
atau -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 $false
direktori untuk. Jangan tidak meninggalkan wildcard tertinggal seperti bin/*
.
Mengapa tidak menggunakan sakelar bawaan? Mereka mengerikan dan menghapus fitur secara acak. Misalnya, untuk dapat menggunakan -Include
file, Anda harus mengakhiri path dengan wildcard. Namun, ini menonaktifkan -Recurse
sakelar tanpa memberi tahu Anda:
Get-ChildItem -File -Recurse -Path ./bin/* -Include *.lib
Anda akan berpikir itu akan memberi Anda semua *.lib
di 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'
?