Używam programu PowerShell do konfigurowania powiązań usług IIS na serwerze sieci Web i mam problem z następującym kodem:
$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]
Jeśli na serwerze jest ponad 2 adresy IP, dobrze - Powershell zwraca tablicę i mogę zapytać o długość tablicy i wyodrębnić pierwszy i drugi adres.
Problem polega na tym, że jeśli istnieje tylko jeden adres IP, Powershell nie zwraca tablicy jednoelementowej, zwraca adres IP (jako ciąg znaków, np. „192.168.0.100”) - ciąg ma .length
właściwość większą niż 1, więc test kończy się pomyślnie i otrzymuję pierwsze dwa znaki w ciągu zamiast pierwszych dwóch adresów IP w kolekcji.
Jak mogę zmusić program Powershell do zwrócenia jednoelementowej kolekcji lub alternatywnie określić, czy zwracana „rzecz” jest obiektem, a nie kolekcją?
powershell
Dylan Beattie
źródło
źródło
Odpowiedzi:
Zdefiniuj zmienną jako tablicę na jeden z dwóch sposobów ...
Zawiń potokowe polecenia w nawiasach z
@
na początku:Określ typ danych zmiennej jako tablicę:
Lub sprawdź typ danych zmiennej ...
źródło
@(...)
zwróci tablicę, nawet jeśli nie ma żadnych obiektów. Natomiast przypisanie wyniku do[Array]
zmiennej typu -typ nadal zwróci $ null, jeśli nie będzie żadnych obiektów.@(...)
działa poprawnie (generuje wynik, którego oczekuję, że powinien dać) dla dowolnego rodzaju obiektów.Return ,$out
które wydaje się zawsze działać. Jeśli znowu napotkam problem, podam przykład.Wymuś wynik na Array, aby mieć właściwość Count. Pojedyncze obiekty (skalarne) nie mają właściwości Count. Ciągi mają właściwość length, więc możesz otrzymać fałszywe wyniki, użyj właściwości Count:
Nawiasem mówiąc, zamiast używać symbolu wieloznacznego, który może również pasować do ciągów, użyj operatora -as:
źródło
-is
?Jeśli wcześniej zadeklarujesz zmienną jako tablicę, możesz dodać do niej elementy - nawet jeśli jest to tylko jeden ...
To powinno działać ...
źródło
Możesz użyć,
Measure-Object
aby uzyskać rzeczywistą liczbę obiektów, bez uciekania się doCount
właściwości obiektu.źródło
Możesz albo dodać przecinek (
,
) przed listą zwrotów, na przykład,return ,$list
rzucić ją[Array]
lub[YourType[]]
w miejscu, w którym zwykle używasz listy.źródło
Miałem ten problem z przekazaniem tablicy do szablonu wdrożenia platformy Azure. Jeśli był jeden obiekt, PowerShell „przekonwertował” go na łańcuch. W poniższym przykładzie
$a
funkcja jest zwracana przez funkcję, która pobiera obiekt wirtualny na podstawie wartości tagu. Przekazuję$a
do poleceniaNew-AzureRmResourceGroupDeployment
cmdlet, zawijając go@()
. Tak jak to:VMObject
jest jednym z parametrów szablonu.Może nie być najbardziej technicznym / niezawodnym sposobem, aby to zrobić, ale wystarczy na platformę Azure.
Aktualizacja
Cóż, powyższe zadziałało. Wypróbowałem wszystkie powyższe i niektóre, ale jedyny sposób, w jaki udało mi się przekazać
$vmObject
jako tablicę, kompatybilną z szablonem rozmieszczenia, z jednym elementem jest następujący (spodziewam się, że MS znowu grało (to był raport i naprawiono błąd w 2015)):$vmObjects
jest wynikiem działania Get-AzureRmVM.Przechodzę
$DeserializedJson
do parametru szablonu wdrożenia (typu tablica).Dla porównania, piękny błąd
New-AzureRmResourceGroupDeployment
generowany przez błąd toźródło
Zwraca jako obiekt, do którego istnieje odwołanie, więc nigdy nie jest konwertowany podczas przekazywania.
źródło