我想收集一些关于域中主机的信息,所以我想写这样的东西:
# 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 变量,但我不知道如何做到这一点......
谢谢!
答案 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