我想通过以下功能在我的网络中的机器上读出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
答案 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,结果在一个对象数组中,你可以很好地操作。