为每次返回添加成员到PSCustomObject

时间:2017-02-15 11:16:05

标签: powershell

我想通过以下功能在我的网络中的机器上读出PS版本:

function CheckPSVersion {
    param ([Parameter(Position = 0)][string[]]$computername)
    if (!$computername) { $computername = $env:computername }
    $y = New-Object PSCustomObject
    $computername | % {
        $x = Invoke-Command -ComputerName $_ -ScriptBlock { ($PSVersionTable.PSVersion).tostring() }
        $y | Add-Member -Membertype NoteProperty -Name Computername -value $_
        $y | Add-Member -Membertype NoteProperty -Name PowerShellVersion -Value $x
    }
    $y
}

但我遇到Add-Member的问题,因为它说“无法将元素添加到”Computername“,因为具有此名称的另一个元素已经存在”

我想要的输出是这样的:

Computername PowerShellVersion
------------ -----------------
SIS          5.0.10240.17146  
SIS1         2.0.10240.17146  
SIS2         5.0.10240.17146  
SIS3         3.0.10240.17146  
SIS4         5.0.10240.17146  
你能帮帮我吗?我真的无法理解add-member

3 个答案:

答案 0 :(得分:2)

这应该足够了:

$computername | ForEach-Object {
    New-Object -Type PSCustomObject -Property @{
        Computername      = $_
        PowerShellVersion = Invoke-Command -ComputerName $_ -ScriptBlock {
                                ($PSVersionTable.PSVersion).ToString()
                            }
    }
}

答案 1 :(得分:1)

您尝试将所有计算机名称添加到同一对象,但实际上需要一个对象列表:

$List = New-Object System.Collections.ArrayList    
$computername | % {
    $y = New-Object PSCustomObject
    $x = Invoke-Command -ComputerName $_ -ScriptBlock {($PSVersionTable.PSVersion).tostring() }
    $y | Add-Member -Membertype NoteProperty -Name Computername -value $_
    $y | Add-Member -Membertype NoteProperty -Name PowerShellVersion -Value 
    $List.Add($y)
}
$List

顺便说一下,你可以替换

param ([Parameter(Position = 0)][string[]]$computername)
if (!$computername) { $computername = $env:computername }

param ([Parameter(Position = 0)][string[]]$computername = $env:computername )

答案 2 :(得分:0)

我会建议类似Ansgar的回复,我也讨厌添加成员CmdLet,它只是看起来很笨重的代码,如果做这样的事情可能会有所帮助:

$y = @()

1..10 | % {
    $y += New-Object PSObject -Property @{ ComputerName = "comp$_"; PowerShellVersion = "1.0" }
}

$y

基本上你是在创建一个空数组,忽略1.10循环(我只用它来给“计算机”不同的名字),但你可以看到你正在向$ y添加一个带有自定义属性的PSObject,结果在一个对象数组中,你可以很好地操作。