当一个调用只返回一个对象时,如何强制Powershell返回一个数组?

我正在使用Powershell在Web服务器上设置IIS绑定,并遇到以下代码的问题:

$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] 

如果服务器上有两个IP地址,那么很好 – Powershell会返回一个数组,我可以查询数组的长度并提取第一个和第二个地址。

问题是 – 如果只有一个IP,Powershell不会返回一个元素数组,它会返回IP地址(如string,如“192.168.0.100”) – string具有.length属性,它大于1 ,所以testing通过了,我最终得到了string中的前两个字符,而不是集合中的前两个IP地址。

我如何强制Powershell返回一个元素集合,或者确定返回的“thing”是一个对象而不是一个集合?

以两种方式之一将数组定义为数组

在一开始用@围住你的pipe道命令:

 $serverIps = @(gwmi Win32_NetworkAdapterConfiguration | Where { $_.IPAddress } | Select -Expand IPAddress | Where { $_ -like '*.*.*.*' } | Sort) 

以数组forms指定variables的数据types:

 [array]$serverIps = gwmi Win32_NetworkAdapterConfiguration | Where { $_.IPAddress } | Select -Expand IPAddress | Where { $_ -like '*.*.*.*' } | Sort 

或者,检查variables的数据types…

 IF ($ServerIps -isnot [array]) { <error message> } ELSE { <proceed> } 

强制结果到一个数组,所以你可以有一个Count属性。 单个对象(标量)没有Count属性。 string有长度属性,所以你可能会得到错误的结果,使用Count属性:

 if (@($serverIps).Count -le 1)... 

顺便说一下,不要使用也可以匹配string的通配符,而应使用-as运算符:

 [array]$serverIps = gwmi Win32_NetworkAdapterConfiguration -filter "IPEnabled=TRUE" | Select-Object -ExpandProperty IPAddress | Where-Object {($_ -as [ipaddress]).AddressFamily -eq 'InterNetwork'} 

如果您提前将variables声明为数组,则可以向其添加元素 – 即使它只是一个元素…

这应该工作…

 $serverIps = @() gwmi Win32_NetworkAdapterConfiguration | Where { $_.IPAddress } | Select -Expand IPAddress | Where { $_ -like '*.*.*.*' } | Sort | ForEach-Object{$serverIps += $_}