2015-12-22 1 views
0

Я пытаюсь запустить команду Get-VMNetworkAdapter в списке виртуальных машинPowerShell выводит аргумент с (@ {Name = имя}: String)

Я получаю список с помощью команды:

Get-VM –ComputerName (Get-ClusterNode –Cluster clustername)|select name 

и она выглядит хорошо, когда я использую

$vmm=Get-VM –ComputerName (Get-ClusterNode –Cluster clustername)|select name 
foreach ($item in $vmm) 
{Get-VMNetworkAdapter -VMName $item} 

это дает мне исключение

nvalidArgument: (@ {Name = VMname}: String)

, как он добавляет все эти символы .. Что такое правильный способ потерять их?

+1

Должно ли быть: '{Get-VMNetworkAdapter -VMName $ item.name}'? –

ответ

1

Необходимо продать собственность. Выберите не удаляет объект иначе:

$vmm = Get-VM –ComputerName (Get-ClusterNode –Cluster clustername) ` 
| Select-Object -ExpandProperty name 

Чтобы объяснить, что -ExpandProperty делает:

Прежде всего, недостатком -ExpandProperty является то, что вы можете сделать это только в один собственности на время.

Select-Object обычно обертывает результаты другим объектом, чтобы свойства оставались свойствами. Если вы скажете $x = Get-ChildItem C:\Windows | Select-Object Name, вы получите массив объектов с одним свойством: Name.

PS C:\> $x = Get-ChildItem C:\Windows | Select-Object Name 
PS C:\> $x 

Name 
---- 
45235788142C44BE8A4DDDE9A84492E5.TMP 
8A809006C25A4A3A9DAB94659BCDB107.TMP 
. 
. 
. 
PS C:\> $x[0].Name 
45235788142C44BE8A4DDDE9A84492E5.TMP 
PS C:\> $x[0].GetType().FullName 
System.Management.Automation.PSCustomObject 

Обратите внимание на заголовок? Name - свойство объекта.

Кроме того, базовый объект с его типа еще вид там:

PS C:\> $x | Get-Member 


     TypeName: Selected.System.IO.DirectoryInfo 

    Name  MemberType Definition 
    ----  ---------- ---------- 
    Equals  Method  bool Equals(System.Object obj) 
    GetHashCode Method  int GetHashCode() 
    GetType  Method  type GetType() 
    ToString Method  string ToString() 
    Name  NoteProperty string Name=45235788142C44BE8A4DDDE9A84492E5.TMP 


     TypeName: Selected.System.IO.FileInfo 

    Name  MemberType Definition 
    ----  ---------- ---------- 
    Equals  Method  bool Equals(System.Object obj) 
    GetHashCode Method  int GetHashCode() 
    GetType  Method  type GetType() 
    ToString Method  string ToString() 
    Name  NoteProperty string Name=bfsvc.exe 

Как правило, это все замечательно. Тем более, что мы обычно хотим несколько свойств объекта.

Иногда, однако, не то, что мы хотим. Иногда мы хотим, чтобы массив был тем же типом, что и выбранное свойство. Когда мы его используем позже, мы хотим, чтобы просто это свойство и ничего больше, и мы хотим, чтобы он был точным того же типа как собственность и ничего больше.

PS C:\> $y = Get-ChildItem C:\Windows | Select-Object -ExpandProperty Name 
PS C:\> $y 
45235788142C44BE8A4DDDE9A84492E5.TMP 
8A809006C25A4A3A9DAB94659BCDB107.TMP 
. 
. 
. 
PS C:\> $y[0].Name 
PS C:\> $y[0] 
45235788142C44BE8A4DDDE9A84492E5.TMP 
PS C:\> $y.GetType().FullName 
System.Object[] 
PS C:\> $y[0].GetType().FullName 
System.String 

Уведомление о том, что заголовка нет, и любые вызовы свойства Name не работают; больше нет свойства Name.

И нет ничего осталось от оригинального объекта:

PS C:\> $y | Get-Member 


    TypeName: System.String 

Name    MemberType   Definition 
----    ----------   ---------- 
Clone   Method    System.Object Clone(), System.Object ICloneable.Clone() 
. 
. 
. 
. 

В основном, здесь это эквивалент делать это:

$z = Get-ChildItem C:\Windows | ForEach-Object { $_.Name } 

который я думаю, что, как вы должны были сделать это в PowerShell v1.0 или v2.0 ... Прошло слишком много лет с тех пор, как я использовал это, чтобы правильно запомнить.

+0

ohh спасибо за быстрый ответ !! это сработало! что на самом деле делает -ExpandProperty? –

+0

Феликс, пожалуйста, отметьте это как ответ на свой пост. – dfundako

+0

@FelixUmansky Пожалуйста, ознакомьтесь с моим обновленным объяснением. Надеюсь, это имеет смысл. –

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