J'utilise Powershell pour configurer des liaisons IIS sur un serveur Web et j'ai un problème avec le code suivant:
$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]
S'il y a plus de 2 adresses IP sur le serveur, très bien - Powershell renvoie un tableau, et je peux interroger la longueur du tableau et extraire les première et deuxième adresses très bien.
Le problème est - s'il n'y a qu'une seule adresse IP, Powershell ne renvoie pas de tableau à un élément, il renvoie l'adresse IP (sous forme de chaîne, comme "192.168.0.100") - la chaîne a une .length
propriété, elle est supérieure à 1, donc le test réussit et je me retrouve avec les deux premiers caractères de la chaîne, au lieu des deux premières adresses IP de la collection.
Comment puis-je forcer Powershell à renvoyer une collection à un élément ou déterminer si la "chose" renvoyée est un objet plutôt qu'une collection?
la source
Réponses:
Définissez la variable sous forme de tableau de l'une des deux manières suivantes ...
Mettez vos commandes canalisées entre parenthèses avec un
@
au début:Spécifiez le type de données de la variable sous forme de tableau:
Ou vérifiez le type de données de la variable ...
la source
@(...)
retournera un tableau même s'il n'y a aucun objet. Alors que l'affectation du résultat à une[Array]
variable de type -typé retournera toujours $ null s'il n'y a aucun objet.@(...)
fonctionne correctement (produit le résultat que je pense qu'il devrait produire) pour tous les types d'objets.Return ,$out
ce qui semble toujours fonctionner. Si je rencontre à nouveau le problème, je posterai un exemple.Forcez le résultat à un tableau afin que vous puissiez avoir une propriété Count. Les objets uniques (scalaires) n'ont pas de propriété Count. Les chaînes ont une propriété length, vous pouvez donc obtenir de faux résultats, utilisez la propriété Count:
À propos, au lieu d'utiliser un caractère générique qui peut également correspondre à des chaînes, utilisez l'opérateur -as:
la source
-is
?Si vous déclarez la variable en tant que tableau à l'avance, vous pouvez y ajouter des éléments - même s'il ne s'agit que d'un seul ...
Cela devrait fonctionner ...
la source
Vous pouvez utiliser
Measure-Object
pour obtenir le nombre d'objets réel, sans recourir à laCount
propriété d' un objet .la source
Vous pouvez soit ajouter une virgule (
,
) avant la liste de retour commereturn ,$list
ou la transtyper[Array]
ou[YourType[]]
à l'endroit où vous avez tendance à utiliser la liste.la source
J'ai eu ce problème en passant un tableau à un modèle de déploiement Azure. S'il y avait un objet, PowerShell l'a «converti» en chaîne. Dans l'exemple ci-dessous,
$a
est retourné à partir d'une fonction qui obtient une VM objectée en fonction de la valeur d'une balise. Je passe le$a
à l'New-AzureRmResourceGroupDeployment
applet de commande en l'enveloppant@()
. Ainsi:VMObject
est l'un des paramètres du modèle.Ce n'est peut-être pas le moyen le plus technique / robuste de le faire, mais c'est suffisant pour Azure.
Mettre à jour
Eh bien, ce qui précède a fonctionné. J'ai essayé tout ce qui précède et certains, mais la seule façon dont j'ai réussi à passer en
$vmObject
tant que tableau, compatible avec le modèle de déploiement, avec un élément est la suivante (je suppose que MS a recommencé (c'était un rapport et corrigé bug en 2015)):$vmObjects
est la sortie de Get-AzureRmVM.Je passe
$DeserializedJson
au paramètre du modèle de déploiement (de type array).Pour référence, la belle erreur
New-AzureRmResourceGroupDeployment
jette estla source
Renvoie en tant qu'objet référencé, donc il n'est jamais converti en passant.
la source