2017-01-04 2 views
0

Я использую функцию 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 уже определен, но я не знаю, как обойти эту проблему и добраться до фактического значения мне нужно - Адрес моего объекта стоимость. Я уверен, что это просто, но я просто не знаю ... Какая уловка для меня?

+1

'$ Инфо | % Address' – PetSerAl

ответ

4

используйте эту команду, это может вам помочь.

$Info | %{$_.Address}

+0

Короткие, сладкие, по сути, и работали как шарм. Благодаря! – Tchotchke

+0

добро пожаловать. спасибо 2 –

1

Это интересный вопрос. Похоже, вы обнаружили ошибку в командлете Test-Connection. Это то, что использует 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

Это не ошибка, это ожидаемое поведение. Когда вы «забыли» поставить скобки после имени метода, PowerShell возвращает объект '' PSMethod' ', описывающий метод. – PetSerAl

+0

Если это правда, то почему это работает? $ ping.status ответ ответ –

+1

Поскольку в v3 новой функции ([член перечисления] (https://blogs.msdn.microsoft.com/powershell/2012/06/13/new-v3-language-features)) был представлен. Поэтому, когда вы запрашиваете свойство или метод, и ** объект коллекции не имеет этого свойства или метода **, то это свойство или метод запрашивается из элементов коллекции. – PetSerAl

1

Интересно, не впадать в случае, но это оказывается основной причиной является то, что массив имеет Address метод.

Вы можете подтвердить следующее: Get-Member -InputObject @(), или, с вашим кодом, Get-Member -InputObject $Info.

Почему это происходит? Хотя это довольно удобно, мы полагаемся на функцию языка, которая откроет свойство из массива, и свойства/методы непосредственно в массиве будут иметь приоритет. Это означает, что нам нужно прибегнуть к различным обходным решениям, на которые ответили люди.

Cheers!

+0

Сам человек! Благодарим вас за ваш блог и PS-скрипты, которые вы предоставляете! Я не могу сказать, сколько времени я спал из-за ваших знаний и готовности поделиться! – Tchotchke

+0

Спасибо за примечание, рад, что это помогает! И спасибо за это, никогда не сталкивались с этим сценарием! –

Смежные вопросы