代码之家  ›  专栏  ›  技术社区  ›  andrej

powershell调用命令以变量形式输出并作为表

  •  0
  • andrej  · 技术社区  · 5 年前

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

    $输出

    最后写主机:

    $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
    

    我明白错误

    哈希文本中的键后缺少“=”运算符

    0 回复  |  直到 5 年前
        1
  •  4
  •   Mark Wragg    5 年前

    问题来自 New-Object 要求向 -Property 参数。

    我觉得你不需要 新建对象 为了得到我认为你想要的东西。

    你也可以考虑使用 Select-Object 而不是 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 
    
        2
  •  0
  •   m0lochwalker    5 年前

    我不能和你的哈希值说话,但是自定义对象的构造看起来很不稳定。我将从正确格式化自定义对象开始,为$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}
    
        } 
    
    }