Ich verwende Powershell, um IIS-Bindungen auf einem Webserver einzurichten, und habe ein Problem mit dem folgenden Code:
$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]
Wenn auf dem Server mehr als 2 IPs vorhanden sind, ist dies in Ordnung. Powershell gibt ein Array zurück. Ich kann die Länge des Arrays abfragen und die erste und die zweite Adresse in Ordnung extrahieren.
Das Problem ist - wenn es nur eine IP gibt, gibt Powershell kein Ein-Element-Array zurück, sondern die IP-Adresse (als Zeichenfolge wie "192.168.0.100") - die Zeichenfolge hat eine .length
Eigenschaft, die größer als 1 ist Der Test besteht und ich erhalte die ersten beiden Zeichen in der Zeichenfolge anstelle der ersten beiden IP-Adressen in der Sammlung.
Wie kann ich Powershell zwingen, eine Sammlung mit einem Element zurückzugeben, oder alternativ feststellen, ob das zurückgegebene "Ding" eher ein Objekt als eine Sammlung ist?
quelle
Antworten:
Definieren Sie die Variable auf zwei Arten als Array ...
Schließen Sie Ihre Piped-Befehle in Klammern mit einem
@
am Anfang ein:Geben Sie den Datentyp der Variablen als Array an:
Oder überprüfen Sie den Datentyp der Variablen ...
quelle
@(...)
wird ein Array zurückgegeben, auch wenn keine Objekte vorhanden sind.[Array]
Wenn Sie das Ergebnis einer Variablen vom Typ -typ zuweisen, wird $ null zurückgegeben, wenn keine Objekte vorhanden sind.@(...)
arbeiten Sie für alle Arten von Objekten richtig (Ergebnis, von dem ich erwarte, dass es erzeugt wird).Return ,$out
, dass es immer zu funktionieren scheint. Wenn ich erneut auf das Problem stoße, werde ich ein Beispiel veröffentlichen.Erzwingen Sie das Ergebnis in ein Array, damit Sie eine Count-Eigenschaft haben können. Einzelne Objekte (skalar) haben keine Count-Eigenschaft. Zeichenfolgen haben eine Längeneigenschaft, sodass Sie möglicherweise falsche Ergebnisse erhalten. Verwenden Sie die Count-Eigenschaft:
Verwenden Sie übrigens den Operator -as, anstatt einen Platzhalter zu verwenden, der auch mit Zeichenfolgen übereinstimmen kann:
quelle
-is
?Wenn Sie die Variable vorab als Array deklarieren, können Sie ihr Elemente hinzufügen - auch wenn es nur eines ist ...
Das sollte funktionieren...
quelle
Sie können verwenden
Measure-Object
, um die tatsächliche Objektanzahl abzurufen, ohne auf dieCount
Eigenschaft eines Objekts zurückzugreifen .quelle
Sie können entweder ein Komma (
,
) vor der Rückgabeliste hinzufügenreturn ,$list
oder umwandeln[Array]
oder[YourType[]]
an der Stelle, an der Sie die Liste verwenden möchten.quelle
Ich hatte dieses Problem beim Übergeben eines Arrays an eine Azure-Bereitstellungsvorlage. Wenn es ein Objekt gab, "konvertierte" PowerShell es in eine Zeichenfolge. Im folgenden Beispiel
$a
wird von einer Funktion zurückgegeben, bei der VM gemäß dem Wert eines Tags beanstandet wird. Ich übergebe das$a
an dasNew-AzureRmResourceGroupDeployment
Cmdlet, indem ich es einwickle@()
. Wie so:VMObject
ist einer der Parameter der Vorlage.Dies ist möglicherweise nicht die technischste / robusteste Methode, reicht jedoch für Azure aus.
Aktualisieren
Nun, das oben genannte hat funktioniert. Ich habe alle oben genannten und einige ausprobiert, aber der einzige Weg, den ich
$vmObject
als Array mit der Bereitstellungsvorlage mit einem Element übergeben konnte, ist wie folgt (ich gehe davon aus, dass MS erneut abgespielt wurde (dies war ein Bericht und behoben) Fehler im Jahr 2015)):$vmObjects
ist die Ausgabe von Get-AzureRmVM.Ich übergebe
$DeserializedJson
den Parameter der Bereitstellungsvorlage (vom Typ Array).Als Referenz ist der schöne Fehler
New-AzureRmResourceGroupDeployment
wirftquelle
Gibt als referenziertes Objekt zurück, sodass es beim Übergeben nie konvertiert wird.
quelle