PowerShell 脚本在某些服务器上失败。失败的服务器上的PowerShell版本为2。
这是代码:
(Get-WmiObject Win32_NetworkAdapterConfiguration -Filter "ipenabled = 'True'").IPAddress[0]
在其工作的服务器上,输出是服务器的 IP 地址。举个例子:
10.1.1.1
在失败的服务器上,输出如下:
无法索引为空数组。行:1 字符:90 + (Get-WMIObject Win32_NetworkAdapterConfiguration -filter "ipenabled = 'True'"(。国际收标[ <<<<0] + 类别信息 : 无效操作: (0:Int32( [], 运行时异常
服务器之间的主要区别是:
- 它在哪里工作(根据我的观察(;有一个IP地址(单个NIC(。
- 在发生故障的服务器上,有多个具有不同子网的 NIC(因此一个 IP 将是 10.x.x.x,第二个将是 172.x.x.x(——我希望脚本从 10.x.x.x 开始拾取 IP。
如果我删除.IPAddress[0]
,这是输出:
脚本:
(Get-WmiObject Win32_NetworkAdapterConfiguration -Filter "ipenabled = 'True'")
工作服务器上的输出:
DHCPEnabled : false IPAddress : {10.x.x.x} DefaultIPGateway : {10.x.x.x} DNSDomain : 服务名称 : 网卡 描述 : 网卡名称 索引 : 11
脚本失败的服务器上的输出:
DHCPEnabled : false IPAddress : {172.x.x.x} 默认IP网关: DNSDomain : 服务名称 : 第 l2 位 描述 : NIC #34 索引 : 13 DHCPEnabled : False IPAddress : {10.x.x.x} DefaultIPGateway : {10.x.x.x} DNSDomain : 服务名称 : 安斯米尼波特 描述: 索引 : 20
这是我在Reddit上找到的两个答案,我正在探索。他们都在工作:
1:
做(某事(.member[index]做了很多假设。我经常像这样对代码进行原型设计,但后来我更改它以获得更好的验证。所以,让我们分解一下...
(something).member[index]
首先,(某些东西(必须计算到一个有效的对象,否则语句的其余部分将无法按预期进行。如果抛出错误会发生什么情况?
然后,.member 假设对象包含此属性,这是无法保证的,因为(某些东西(不是以上面万无一失的方式处理的。
最后,[index] 假设您有一个多个对象的数组/容器/列表/任何内容。我经常遇到这个问题,根据情况,行为并不总是一致的,所以我确保确认(在真正重要的地方(我是否有一个或更多对象,或者只是使用不同的方法。
通过管道和使用 cmdlet,而不是直接访问成员和做出假设,可以避免许多问题。就像/u/SeeminglyScience 说的那样,这会更好......
something | select-object member
这样,如果某些内容没有返回任何内容,管道就不会再进一步。
如果成员可能是一个容器,并且您想要所有元素...
something | select-object -expandproperty member
而且,如果成员可能是一个容器,并且您只需要第一个元素...
something | select-object -expandproperty member | select-object -first 1
所以,在你的情况下...
Get-wmiobject win32_networkadapterconfiguration | Select-Object -ExpandProperty IPAddress | Select-Object -First 1
如果您想为所有 10.x 过滤 IP,我让这个为我工作......
Get-wmiobject win32_networkadapterconfiguration | Select-Object -ExpandProperty IPAddress | Where-Object {$PSItem -match "10.d{1,3}.d{1,3}.d{1,3}"}
此时,您应该获得一个带有 IP 或 $null 的值,这更容易处理。
第二个解决方案:
$1stOctet = '192' $IPInfo = Get-WmiObject win32_networkadapterconfiguration -filter "ipenabled = 'True'" | Where-Object {$_.IPAddress -match "^$1stOctet"} |选择对象 - 扩展属性 IP 地址