Saya menggunakan Powershell untuk menyiapkan pengikatan IIS di server web, dan mengalami masalah dengan kode berikut:
$serverIps = gwmi Win32_NetworkAdapterConfiguration
| Where { $_.IPAddress }
| Select -Expand IPAddress
| Where { $_ -like '*.*.*.*' }
| Sort
if ($serverIps.length -le 1) {
Write-Host "You need at least 2 IP addresses for this to work!"
exit
}
$primaryIp = $serverIps[0]
$secondaryIp = $serverIps[1]
Jika ada 2+ IP di server, baiklah - Powershell mengembalikan array, dan saya dapat menanyakan panjang array dan mengekstrak alamat pertama dan kedua dengan baik.
Masalahnya adalah - jika hanya ada satu IP, Powershell tidak mengembalikan larik satu elemen, Powershell mengembalikan alamat IP (sebagai string, seperti "192.168.0.100") - string memiliki .length
properti, lebih besar dari 1, jadi tes lulus, dan saya berakhir dengan dua karakter pertama dalam string, bukan dua alamat IP pertama dalam kumpulan.
Bagaimana saya bisa memaksa Powershell untuk mengembalikan koleksi satu elemen, atau secara alternatif menentukan apakah "benda" yang dikembalikan adalah objek daripada koleksi?
sumber
Jawaban:
Tentukan variabel sebagai array dengan salah satu dari dua cara ...
Bungkus perintah pip Anda dalam tanda kurung dengan
@
di awal:Tentukan tipe data dari variabel sebagai array:
Atau, periksa tipe data variabel ...
sumber
@(...)
akan mengembalikan larik meskipun tidak ada objek. Sedangkan menugaskan hasil ke[Array]
variabel -typed masih akan mengembalikan $ null jika ada objek nol.@(...)
bekerja dengan baik (menghasilkan hasil yang saya harapkan harus menghasilkan) untuk semua jenis objek.Return ,$out
yang tampaknya selalu berhasil. Jika saya mengalami masalah lagi, saya akan memposting contoh.Paksa hasilnya ke Array sehingga Anda bisa memiliki properti Count. Objek tunggal (skalar) tidak memiliki properti Hitungan. String memiliki properti panjang sehingga Anda mungkin mendapatkan hasil yang salah, gunakan properti Hitung:
Ngomong-ngomong, alih-alih menggunakan karakter pengganti yang juga bisa mencocokkan string, gunakan operator -as:
sumber
-is
?Jika sebelumnya Anda mendeklarasikan variabel sebagai array, Anda dapat menambahkan elemen ke dalamnya - meskipun itu hanya satu ...
Ini harus bekerja ...
sumber
Anda dapat menggunakan
Measure-Object
untuk mendapatkan jumlah objek sebenarnya, tanpa menggunakanCount
properti objek.sumber
Anda dapat menambahkan koma (
,
) sebelum daftar kembali sepertireturn ,$list
atau melemparkannya[Array]
atau[YourType[]]
di tempat Anda cenderung menggunakan daftar.sumber
Saya mengalami masalah ini saat meneruskan array ke template penerapan Azure. Jika ada satu objek, PowerShell "mengubahnya" menjadi string. Dalam contoh di bawah ini,
$a
dikembalikan dari fungsi yang membuat VM diobjek sesuai dengan nilai sebuah tag. Saya mengoper$a
keNew-AzureRmResourceGroupDeployment
cmdlet dengan membungkusnya@()
. Seperti:VMObject
adalah salah satu parameter template.Mungkin bukan cara paling teknis / kuat untuk melakukannya, tetapi cukup untuk Azure.
Memperbarui
Nah di atas berhasil. Saya sudah mencoba semua hal di atas dan beberapa, tetapi satu-satunya cara saya berhasil lulus
$vmObject
sebagai array, kompatibel dengan template penerapan, dengan satu elemen adalah sebagai berikut (saya berharap MS telah bermain lagi (ini adalah laporan dan diperbaiki bug di 2015)):$vmObjects
adalah keluaran dari Get-AzureRmVM.Saya meneruskan
$DeserializedJson
ke parameter template penerapan (dari tipe array).Sebagai referensi, kesalahan yang bagus
New-AzureRmResourceGroupDeployment
adalahsumber
Kembali sebagai objek yang direferensikan, jadi tidak pernah dikonversi saat meneruskan.
sumber