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

时间:2018-10-18 10:50:43

标签: powershell null

PowerShell脚本在某些服务器上失败。失败的服务器上的PowerShell版本是2。

代码如下:

(Get-WmiObject Win32_NetworkAdapterConfiguration -Filter "ipenabled = 'True'").IPAddress[0]

在运行该服务器的服务器上,输出是服务器的IP地址。例如:

  

10.1.1.1

在失败的服务器上,输出如下:

Cannot index into a null array. At line:1 char:90
+ (Get-WmiObject Win32_NetworkAdapterConfiguration -Filter "ipenabled = 'True'").IPAddress[ <<<< 0]
    + CategoryInfo : InvalidOperation: (0:Int32) [], RuntimeException

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

  1. 它在哪里工作(根据我的观察);只有一个IP地址(单个NIC)。
  2. 在发生故障的服务器上,存在多个具有不同子网的NIC(因此,一个IP将是10.xxx,第二个IP将是172.xxx)-我希望脚本从10.xxx开始选择IP。 / li>

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

脚本:

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

工作服务器上的输出:

DHCPEnabled      : False
IPAddress        : {10.x.x.x}
DefaultIPGateway : {10.x.x.x}
DNSDomain        :
ServiceName      : NIC
Description      : NIC NAME
Index            : 11

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

DHCPEnabled      : False
IPAddress        : {172.x.x.x}
DefaultIPGateway :
DNSDomain        :
ServiceName      : l2nd
Description      : NIC #34
Index            : 13

DHCPEnabled      : False
IPAddress        : {10.x.x.x}
DefaultIPGateway : {10.x.x.x}
DNSDomain        :
ServiceName      : iANSMiniport
Description      : 
Index            : 20

1 个答案:

答案 0 :(得分:0)

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

1:

Doing(something).member [index]做了很多假设。我经常会像这样编写代码原型,但是为了更好的验证,我随后对其进行了更改。所以,让我们分解一下...

(something).member[index]

首先,(某些东西)必须求值一个有效的对象,否则该语句的其余部分将无法按预期进行。如果抛出错误会怎样?

然后,.member假定该对象包含此属性,这是不能保证的,因为上面的(某些东西)没有以万无一失的方式进行处理。

最后,[索引]假设您拥有一个数组/容器/列表/多个对象。我经常遇到这个问题,并且视情况而定,行为并不总是一致的,因此,请确保确认(在真正重要的地方)我是单个对象还是多个对象,或者仅使用其他方法。

通过管道传递和使用cmdlet而不是直接访问成员并进行假设,可以避免很多问题。就像/ u / SeeminglyScience所说的那样,这样做会更好...

something | select-object member

这样,如果某事什么也没返回,则管道将无法继续前进。

如果member可能是容器,并且您需要所有元素...

something | select-object -expandproperty member

并且,如果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'” | 哪里对象{$ _。IPAddress -match“ ^ $ 1stOctet”} |选择对象-扩展属性IP地址