Dyl*_*tie 105 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]
Run Code Online (Sandbox Code Playgroud)
如果服务器上有2个以上的IP,那么很好 - Powershell返回一个数组,我可以查询数组长度并提取第一个和第二个地址就好了.
问题是 - 如果只有一个IP,Powershell不返回单元素数组,它返回IP地址(作为字符串,如"192.168.0.100") - 字符串有一个.length
属性,它大于1,所以测试通过,我最后得到字符串中的前两个字符,而不是集合中的前两个IP地址.
如何强制Powershell返回单元素集合,或者确定返回的"thing"是对象而不是集合?
JNK*_*JNK 123
使用以下两种方式之一将变量定义为数组...
用一个@
开头的括号中的管道命令包装:
$serverIps = @(gwmi Win32_NetworkAdapterConfiguration
| Where { $_.IPAddress }
| Select -Expand IPAddress
| Where { $_ -like '*.*.*.*' }
| Sort)
Run Code Online (Sandbox Code Playgroud)
将变量的数据类型指定为数组:
[array]$serverIps = gwmi Win32_NetworkAdapterConfiguration
| Where { $_.IPAddress }
| Select -Expand IPAddress
| Where { $_ -like '*.*.*.*' }
| Sort
Run Code Online (Sandbox Code Playgroud)
或者,检查变量的数据类型......
IF ($ServerIps -isnot [array])
{ <error message> }
ELSE
{ <proceed> }
Run Code Online (Sandbox Code Playgroud)
Sha*_*evy 11
将结果强制为数组,以便您可以拥有Count属性.单个对象(标量)没有Count属性.字符串具有length属性,因此您可能会得到错误的结果,使用Count属性:
if (@($serverIps).Count -le 1)...
Run Code Online (Sandbox Code Playgroud)
顺便说一句,使用-as运算符,而不是使用也可以匹配字符串的通配符:
[array]$serverIps = gwmi Win32_NetworkAdapterConfiguration -filter "IPEnabled=TRUE" | Select-Object -ExpandProperty IPAddress | Where-Object {($_ -as [ipaddress]).AddressFamily -eq 'InterNetwork'}
Run Code Online (Sandbox Code Playgroud)
小智 5
如果您提前将变量声明为数组,则可以向其中添加元素 - 即使它只是一个...
这应该工作......
$serverIps = @()
gwmi Win32_NetworkAdapterConfiguration
| Where { $_.IPAddress }
| Select -Expand IPAddress
| Where { $_ -like '*.*.*.*' }
| Sort | ForEach-Object{$serverIps += $_}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
48939 次 |
最近记录: |