如何从变量输入对象

时间:2018-05-25 15:18:01

标签: powershell

我已经做了一段时间,并且已经意识到问题主要取决于如何操纵数据。

我有一个命令,它从远程注册表中检索数据以获取服务器列表

$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名字,现在正在给我一个阻止。我可以预先扫描所有服务器注册表并获取所有唯一名称,但这似乎是一个非常浪费的解决方案。

1 个答案:

答案 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