invoke-команду powershell для переменной и выписать в виде таблицы - PullRequest
0 голосов
/ 15 марта 2019

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

$ output

и write-host в конце:

$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

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

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

Ответы [ 2 ]

4 голосов
/ 15 марта 2019

Проблема связана с командлетом 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 
0 голосов
/ 15 марта 2019

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

$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}

    } 

}
...