Как построить новый массив из переменных входных объектов - PullRequest
0 голосов
/ 25 мая 2018

Я работал над этим некоторое время и понял, что проблема главным образом в том, как манипулировать данными.

У меня есть команда, которая извлекает данные из удаленных реестров для списка серверов

$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  

Реестримя ключа является константой, но в нем может быть много пар данных и значений:

Это означает, что подача его в массив / массив адресов, как этот, не будет работать:

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 определенных свойства), и я потеряю дополнительные значения при последующих записях с большим количеством значений.В этом примере он не будет добавлять значения «SERVER2», потому что есть новое поле, и если при извлечении возникнет ошибка, он установит ComputerName, Key, Hive, Type в качестве полей объекта и проигнорирует любые другие

Anyуказатели на то, как я могу легко сопоставить эти данные в объект - я пытаюсь получить запись для каждого сервера с полями 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 голосов
/ 25 мая 2018

Я мог бы заранее просканировать ВСЕ реестры серверов и получить все уникальные имена, но это кажется довольно расточительным решением.

Да, это было бы странно, так как вы уже запрашиваете эти данныеодин раз.Однако то, что вы должны сделать, это отложить создание ваших объектов, пока у вас не будут все ответы.Собрать из реестра значения и данные вы можете.Используйте их, чтобы получить уникальный список, а затем создайте свойства вашего объекта для каждого компьютера, к которому вы обращались.

# 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...