无法访问数组变量

时间:2017-01-04 23:37:06

标签: powershell

我正在使用Invoke-Ping功能(在这里找到:https://gallery.technet.microsoft.com/scriptcenter/Invoke-Ping-Test-in-b553242a),它运行良好。它创建的输出如下所示:

> $Info = Invoke-Ping $ComputerNames -ErrorAction SilentlyContinue
> $Info[0..2]

Address      : Machine1
IPV4Address  : 10.10.44.213 
IPV6Address  : 
ResponseTime : 0 
STATUS       : Responding

Address      : Machine2
IPV4Address  : 10.10.4.46 
IPV6Address  :  
ResponseTime : 0 
STATUS       : Responding

Address      : Machine3 
IPV4Address  : 10.10.4.58 
IPV6Address  :  
ResponseTime : 0 
STATUS       : Responding

我遇到的问题是当我尝试使用$ Info.Address输出机器名时。当我输入$ Info.Address时,我得到了

OverloadDefinitions                                                                                        
-------------------                                                                                        
System.Object&, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Address(int )  

我确定这是因为.Address已经定义但我不知道如何解决这个问题并获得我需要的实际值 - 我的对象的地址值。我确定它很简单,但我只是无知......找到我的价值的诀窍是什么?

3 个答案:

答案 0 :(得分:4)

使用此命令可能会对您有所帮助。

$Info | %{$_.Address}

答案 1 :(得分:1)

这是一个有趣的问题。您好像在Test-Connection cmdlet中发现了一个错误。这就是Invoke-Ping用来ping计算机的内容。

PetSerAl是正确的。您可以使用ForEach来获得正确的输出。或者,您也可以手动指定要查找的数组中的项目。例如:

#Display Address of First item
$info[0].Address


#Display Address of All items
$info | Foreach {$_.Address}
#or
for ($i=0; $i -lt $info.Count; $i++) { $info[$i].Address }

答案 2 :(得分:1)

有趣的是,没有碰到这种情况,但似乎根本原因是数组有一个Address方法。

您可以这样验证:Get-Member -InputObject @(),或者使用您的代码Get-Member -InputObject $Info进行验证。

为什么会这样?虽然它非常方便,但我们依赖的语言功能将从数组中解析出属性,并且直接在数组上的属性/方法将优先。这意味着我们需要求助于人们回答的各种变通方法。

干杯!