PowerShell 空数组错误(字符串:空错误)



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( [], 运行时异常

服务器之间的主要区别是:

  1. 它在哪里工作(根据我的观察(;有一个IP地址(单个NIC(。
  2. 在发生故障的服务器上,有多个具有不同子网的 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 的值,这更容易处理。

  1. 第二个解决方案:

    $1stOctet = '192' $IPInfo = Get-WmiObject win32_networkadapterconfiguration -filter "ipenabled = 'True'" | Where-Object {$_.IPAddress -match "^$1stOctet"} |选择对象 - 扩展属性 IP 地址

相关内容

  • 没有找到相关文章

最新更新