powershell invoke-command 到变量并写为 table

powershell invoke-command to variable and write out as a table

我有以下代码,从我想要得到的输出到

$output

最后写主机:

$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

我收到错误

Missing '=' operator after key in hash literal

问题来自 New-Object cmdlet,它期望向 -Property 参数提供散列 table。

我认为您根本不需要 New-Object 来获得我认为您想要的东西。

您可能还想考虑使用 Select-Object 而不是 Format-Table,然后在最后使用 Format-Table,以便在需要时可以更灵活地进一步处理结果.

您也可以 return 直接 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 

我不能说你的散列,但自定义对象的构造看起来很不稳定。我将从为 $outputs 中你想要的每个项目使用 Name/Value 对正确格式化自定义对象开始,并在每次迭代中直接附加 $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}

    } 

}