Pertimbangkan skrip Powershell berikut ini, yang mencari folder di C: \ dengan 'og' di namanya:
PS C: \> (ls |% {$ _. Name} |? {$ _. Berisi ("og")}) PerfLogs File program setup.log
Sekarang saya mempersempit pencarian untuk mendapatkan hanya satu item:
PS C: \> (ls |% {$ _. Name} |? {$ _. Berisi ("Prog")}) File program
Yang aneh adalah bahwa operasi pertama menghasilkan array , sedangkan operasi kedua (yang IMHO operasi semantik yang sama, sehingga harus menghasilkan jenis hasil yang sama) menghasilkan string . Ini bisa dilihat pada hasil berikut:
PS C: \> (ls |% {$ _. Name} |? {$ _. Berisi ("og")}). Panjang 3 PS C: \> (ls |% {$ _. Name} |? {$ _. Berisi ("Prog")}). Panjang 13
Ini bisa sangat menjengkelkan, karena ternyata ada lebih sedikit folder yang cocok dengan 'og' daripada mereka yang cocok dengan 'Prog'.
Jelas, PowerShell secara implisit 'unboxes' satu-item array ke satu objek, dan kami tidak pernah mendapatkan array dengan panjang 1. Tampaknya setiap kali saya ingin menghitung hasil yang datang melalui pipa, saya harus memeriksa apakah saya ' Saya berurusan dengan array atau tidak.
Bagaimana saya bisa mencegah hal ini terjadi? Bagaimana Anda menangani ini?
sumber
$_.Contains
, maka%{,,$_.Name}
berfungsi ...Jawaban:
Dan hasil nol item untuk
$null
.Kamu tidak bisa
Gunakan konstruktor array (
@(...)
) untuk memaksa koleksi (mungkin dengan nol atau satu elemen) kembali:sumber
@(1) | ConvertTo-Json
masih kembali1
sebagai gantinya[1]
.ConvertTo-Json
tidak pernah mengembalikan koleksi: itu membaca seluruh input dan mengkonversi ke string tunggal. Jika Anda ingin objek input dikonversi secara individual, Anda harus memprosesnya secara terpisah.Ini telah diatasi dalam PowerShell v3:
http://blogs.microsoft.co.il/blogs/scriptfanatic/archive/2012/03/19/Counting-objects-in-PowerShell-3.0.aspx
Di samping catatan, Anda dapat menemukan jika nama berisi sesuatu menggunakan wildcard:
sumber
Perhatikan perbedaan antara dua hasil ini:
Intinya adalah bahwa 'unboxing' sedang dilakukan oleh operasi pipa. ConvertTo-Json masih melihat objek sebagai array jika kita menggunakan InputObject daripada perpipaan.
sumber