我已经做了一段时间,并且已经意识到问题主要取决于如何操纵数据。
我有一个命令,它从远程注册表中检索数据以获取服务器列表
$RegData = Get-RegValue -ComputerName $($Target.ComputerName) -Hive $RegHive -Key $KeyName -ping -ErrorAction Stop -WarningAction Stop
现在问题显而易见,我已经看过数据了 - 从注册表查询返回的键/值的数量是可变的。
ComputerName Hive Key Value Data
------------ ---- --- ----- ----
SERVER1 LocalMachine SOFTWARE\NSS\Serv... AssetNumber 987412
SERVER1 LocalMachine SOFTWARE\NSS\Serv... BuildDate 02/02/2017
SERVER1 LocalMachine SOFTWARE\NSS\Serv... iLODefaultPwd NA
ComputerName Hive Key Value Data
------------ ---- --- ----- ----
SERVER2 LocalMachine SOFTWARE\Serv... AssetNumber 984213
SERVER2 LocalMachine SOFTWARE\Serv... BuildDate 02/02/2017
SERVER2 LocalMachine SOFTWARE\Serv... iLODefaultPwd NA
SERVER2 LocalMachine SOFTWARE\Serv... ContactTel 8237
注册表项名称是常量,但在:
中可以有许多数据和值对这意味着将它送入像这样的阵列/ arraylist不会起作用:
Function GetRegistryData {
ForEach ($Target in $ImportData) {
$RegData = Get-RegValue -ComputerName $($Target.ComputerName) -Hive $RegHive -Key $KeyName -ping -ErrorAction Stop -WarningAction Stop
$NewObject = New-Object PSObject
$NewObject | Add-Member -NotePropertyName 'ComputerName' -NotePropertyValue $Target.ComputerName
$NewObject | Add-Member -NotePropertyName 'Key' -NotePropertyValue $KeyName
$RegData | ForEach {
$NewObject | Add-Member -NotePropertyName $_.Value -NotePropertyValue $_.Data
}
$NewObject | Add-Member -NotePropertyName 'Hive' -NotePropertyValue $RegHive
$NewObject | Add-Member -NotePropertyName 'Type' -NotePropertyValue $RegData[0].Type
$NewObject
}
}
数组将由我发送的第一组值定义(或者如果收集数据时出错,则默认为我设置的4个特定属性)和I&# 39; ll将在具有更多值的后续条目上丢失其他值。在这个例子中,它不会附加" SERVER2"值因为有一个新字段,如果在检索它时出错,则将ComputerName,Key,Hive,Type设置为对象字段并忽略任何其他字段
关于如何将这些数据轻松整理到对象中的任何指示 - 我试图获取具有Value,Data字段的每服务器条目,如下所示:
ComputerName Hive Key AssetNumber BuildDate
------------ ---- --- ----- ----
SERVER1 LocalMachine SOFTWARE\Serv... 987412 02/02/2017
SERVER2 LocalMachine SOFTWARE\Serv... 984123 02/02/2017
事实上我事先并不知道所有的noteproperty名字,现在正在给我一个阻止。我可以预先扫描所有服务器注册表并获取所有唯一名称,但这似乎是一个非常浪费的解决方案。
答案 0 :(得分:2)
我可以预先扫描所有服务器注册表并获取所有唯一名称,但这似乎是一个非常浪费的解决方案。
是的,这很奇怪,因为你已经查询了一次这个数据。然而,你应该做的是延迟制作你的对象,直到你得到所有的答案。收集您可以注册的值和数据。使用它们获取唯一列表,然后为您查询的每台计算机创建对象属性。
# Registry specific variables
$hive = 'LocalMachine'
$key = 'software\somekey'
# List of target computers
$computers = "comp1","comp2","comp7635","bagel"
# Cycle each of those
$gatheredData = $computers | ForEach-Object{
# Attempt to get registry values. Store what we find in one property
[pscustomobject]@{
ComputerName = $_
RegistryValues = Get-RegValue -Hive $hive -Key $key -Ping -ComputerName $_ -WarningAction SilentlyContinue
}
}
# Determine the distinct value data pairs we have based on queried data
$uniqueValues = $gatheredData.registryvalues.Value | Select-Object -Unique
# Extend the current objects to add off the columns and populate with data where found
foreach($result in $gatheredData){
foreach($value in $uniqueValues){
# If exists, get the data of the value in the collected registry values
$ValueData = ($result.RegistryValues | Where-Object{$_.value -eq $value}).Data
Add-Member -InputObject $result -MemberType NoteProperty -Name $value -Value $ValueData
}
}
# Display the new object minus the collected values property
$gatheredData | Select-Object * -ExcludeProperty RegistryValues