【问题标题】:PowerShell null array error (string:Null Error)PowerShell空数组错误(字符串:空错误)
【发布时间】:2018-10-18 10:50:42
【问题描述】:

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'").IPAddress[

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

  1. 在哪里工作(根据我的观察);有一个 IP 地址(单个 NIC)。
  2. 在失败的服务器上,有多个具有不同子网的 NIC(因此一个 IP 将是 10.x.x.x,第二个 IP 将是 172.x.x.x)——我希望脚本从 10.x.x.x 开始获取 IP。

如果我删除.IPAddress[0],这是输出:

脚本:

(Get-WmiObject Win32_NetworkAdapterConfiguration -Filter "ipenabled = 'True'")

工作服务器上的输出:

DHCP启用:假 IP 地址:{10.x.x.x} 默认IPGateway:{10.x.x.x} DNS域: 服务名称:网卡 描述:网卡名称 指数:11

脚本失败的服务器上的输出:

DHCP启用:假 IP 地址:{172.x.x.x} 默认IPGateway: DNS域: 服务名称:l2nd 描述:网卡#34 索引 : 13 DHCP启用:假 IP 地址:{10.x.x.x} 默认IPGateway:{10.x.x.x} DNS域: 服务名称:iANSMiniport 描述 : 指数:20

【问题讨论】:

  • 数组没有IPAddress属性,并且成员枚举是在PowerShell v3中“发明”的,所以它在v2中不起作用。
  • 如何使脚本向后兼容版本 2?
  • Get-WmiObject ... | Select-Object -First 1 -Expand IPAddress
  • 虽然这确实给出了输出。除非我们正在寻找从“10”开始的 IP 地址,否则它将不起作用。你能帮忙吗?
  • 请查阅 PowerShell 教程。按属性值过滤项目几乎是最基本的。

标签: powershell null


【解决方案1】:

这是我在 Reddit 上找到的两个我正在探索的答案。他们都在工作:

1:

Doing (something).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"} |选择对象-ExpandProperty IPAddress

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-23
    • 2012-05-11
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-18
    相关资源
    最近更新 更多