Powershell:如何动态构建数组或对象?

时间:2014-04-18 20:31:36

标签: arrays powershell reference

我想收集一些关于域中主机的信息,所以我想写这样的东西:

# declare array for storing final data
$servers_list = @() 
#start with a list of servers and go through collecting the info
$servers | ForEach-Object {
  $sys = Get-WmiObject Win32_computersystem -ComputerName $_
  # create new custom object to store information
  $server_obj = New-Object –TypeName PSObject
  $server_obj | Add-Member –MemberType NoteProperty –Name Domain –Value $sys.Domain
  # .... add all other relevant info in the same manner

  # Add server object to the array
  $servers_list += $server_obj
 }

此代码的问题在于我将对象的引用传递给数组而不是实际对象。所以当我的循环完成时,我最终会得到一个包含行的数组看起来都一样:(

知道如何将实际对象传递给数组而不仅仅是对它的引用吗? 另一个想法是每次动态声明新对象而不是使用 $ server_obj 变量,但我不知道如何做到这一点......

谢谢!

3 个答案:

答案 0 :(得分:3)

您可以构建一个对象数组,并像以下一样动态添加信息:

#This will be your array of objects 
#In which we will keep adding objects from each computer
$Result = @() 

#start with a list of servers and go through collecting the info
$servers | ForEach-Object {

     $sys = Get-WmiObject Win32_computersystem -ComputerName $_
     # create new custom object to keep adding store information to it
     $Result += New-Object –TypeName PSObject -Property @{Domain = $sys.Domain;
                                                          Name = $sys.Name;
                                                          SystemType = $sys.SystemType
                                                         }

 }

# Get back the objects 
$Result

其中Domain,Name和SystemType是您要与对象关联的属性。

答案 1 :(得分:0)

听起来它传递了一个参考,但我并不认为它是作为参考传递的对象,而是属性值。有离散的对象,但它们的属性值都有相同的引用,所以它们看起来都一样。如果是这样的话,

$server_obj | Add-Member –MemberType NoteProperty –Name Domain –Value "$($sys.Domain)"

应该将值设为字符串,这是一种值类型并且不会发生变化。

答案 2 :(得分:0)

您正在使它比应做的要难一些。从查询,csv或list传递服务器名称,然后对其进行迭代。从结果中选择所需的内容。

$info = "server1", "server2" | ForEach-Object{Get-WmiObject  -Class win32_computersystem -ComputerName $_ } | Select-Object Domain, Name, Systemtype

$info[1].Domain will output domain.com