当一个调用只返回一个对象时,如何强制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 += $_}