如何让PowerShell在只返回一个对象时返回一个数组?

21 浏览
0 Comments

如何让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]

如果服务器上有2个或以上的IP,则没问题-PowerShell返回一个数组,我可以查询数组长度并提取第一个和第二个地址。

问题在于-如果只有一个IP,PowerShell不会返回一个包含一个元素的数组,它会返回IP地址(作为字符串,比如\"192.168.0.100\")-字符串具有.length属性,它的长度大于1,所以测试通过,我最终得到了字符串中的前两个字符,而不是集合中前两个IP地址。

我如何强制PowerShell返回一个包含一个元素的集合,或者确定返回的“东西”是对象而不是集合?

admin 更改状态以发布 2023年5月21日
0
0 Comments

将结果强制转化为数组以便你可以使用Count属性。单个对象(标量)没有Count属性。字符串有一个length属性,所以你可能会得到错误的结果,使用Count属性:

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

顺便说一下,不要使用可能也匹配字符串的通配符,而是使用-as运算符:

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

0
0 Comments

有两种方式将变量定义为数组...

在管道命令之前加上括号并在开头加上符号@

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

将变量的数据类型指定为数组:

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

或者,检查变量的数据类型...

IF ($ServerIps -isnot [array])
{  }
ELSE
{  }

0