команда вызова powershell для переменной и записи в виде таблицы

У меня есть следующий код, из которого я хотел бы получить вывод

$ вывод

и напишите хост в конце:

$outputs = @()
foreach ($comp in $maschines.name) { 
    $output = New-Object PSObject -Property @{
            invoke-command -computer comp3 -ScriptBlock { get-vm –VMName $using:comp | Select-Object VMId | Get-VHD | ft @{
            label="vm"; expression={$using:comp}}, 
            path,
            VhdType, 
            VhdFormat, 
            @{label="file(gb)"; expression={($_.FileSize / 1GB) -as [int]}}, 
            @{label="size(gb)"; expression={($_.Size / 1GB) -as [int]}} -AutoSize 
        }
    }
    $outputs += $output
}

$outputs

я получаю ошибку

Отсутствует оператор '=' после ключа в хеш-литерале


person andrej    schedule 15.03.2019    source источник


Ответы (2)


Проблема связана с командлетом New-Object, который ожидает предоставления хеш-таблицы для параметра -Property.

Я не думаю, что вам вообще нужно New-Object, чтобы получить то, что, как я думаю, вам нужно.

Вы также можете использовать Select-Object вместо Format-Table, а затем использовать Format-Table в конце, чтобы дать вам больше гибкости в том, как вы можете в дальнейшем манипулировать результатами, если это необходимо.

Вы также можете вернуть результат ForEach напрямую, а не добавлять в массив, что менее эффективно, поскольку массив каждый раз создается заново:

$output = foreach ($comp in $maschines.name) { 
    invoke-command -computer comp3 -ScriptBlock {
        get-vm –VMName $using:comp | Select-Object VMId | Get-VHD | Select-Object @{ label = "vm"; expression = {$using:comp} }, 
        path,
        VhdType, 
        VhdFormat, 
        @{label = "file(gb)"; expression = {($_.FileSize / 1GB) -as [int]} }, 
        @{label = "size(gb)"; expression = {($_.Size / 1GB) -as [int]} }
    }
}

$output | Format-Table -AutoSize 
person Mark Wragg    schedule 15.03.2019
comment
Я хотел бы отметить, что использование New-Object PSObject, [pscustomobject]@{} и вычисляемых свойств с Select-Object приводит к одному и тому же результату. Выбор одного над другим - это выбор стиля (хотя вы получаете удар по производительности, используя New-Object). - person Maximilian Burszley; 15.03.2019
comment
Согласен, но формат-объект был определенно неправильным выбором. - person Mark Wragg; 15.03.2019

Я не могу говорить с вашими хэшами, но конструкция пользовательского объекта выглядит довольно шаткой. Я бы начал с правильного форматирования пользовательского объекта с помощью пары «Имя/значение» для каждого элемента, который вы хотите получить в $outputs, и добавлял $outputs непосредственно с каждой итерацией...

$outputs = @()

foreach ($comp in $maschines.name) { 

    $outputs += [pscustomobject]@{

        Prop1 = Get-VM -Name $comp | Select -ExpandProperty Value1
        Prop2 = Get-VM -Name $comp | Select -ExpandProperty Value2
        Prop3 = Invoke-Commmand -ComputerName $comp -Scriptblock {Get-Something | Select Something}

    } 

}
person m0lochwalker    schedule 15.03.2019
comment
Вам не нужно добавлять новый объект на каждой итерации: просто назначьте результат цикла переменной. $myvar = foreach (... Это значительно быстрее. - person Maximilian Burszley; 15.03.2019