Powershell экспортирует массивы вложенных объектов в CSV - PullRequest
0 голосов
/ 18 июня 2020

Когда я смотрю в массив объектов и набираю $ obj [2] (в качестве экзамена), я получаю

Name      : audit_event
UUID      : c6479a6f-f1bd-4759-9881-fcb493821aff
Timestamp : 17-06-20 13:30:48 +00:00
Fields    : {[audit_schema_version, 1], [event_time, 17-06-20 13:30:48 +00:00], [sequence_number, 1], [action_id, 541934402]...}
Actions   : {}

Я хотел бы собрать все поля в один файл csv.

Итак, сначала я начал искать хотя бы поля, но, несмотря на некоторые решения, которые я видел, у меня все не получается.

foreach ($UUID in $logsOBJECT[2].UUID) {
  echo $UUID
  foreach ($field in $logsOBJECT.$UUID.Keys) {
    echo $field
    }
  }

Это не работает. Я не разработчик Powershell, поэтому новичок.

Мне приходится использовать Powershell, потому что Synaps Analytics не дает лучшего варианта для чтения и обработки файлов журнала.

С уважением, Гарри 1013 *

Ответы [ 2 ]

0 голосов
/ 18 июня 2020

У меня нет вашего точного PS-модуля SynapsAnalystics ...

Но, похоже, проблема с доступом к вложенным массивам в Powershell.

Здесь у меня есть пример с Windows services:

PS C:\WINDOWS\system32> $servic[20] | fl


Name                : BrokerInfrastructure
DisplayName         : Background Tasks Infrastructure Service
Status              : Running
DependentServices   : {workfolderssvc, WMPNetworkSvc, WSearch, embeddedmode}
ServicesDependedOn  : {DcomLaunch, RpcSs, RpcEptMapper}
CanPauseAndContinue : False
CanShutdown         : False
CanStop             : False
ServiceType         : Win32ShareProcess

Здесь, если мне нужен вывод $ servi c .DependentServices , мне нужно знать ключи \ свойства $ servi c .DependentServices. ie,

Вы можете получить это по:

PS C:\WINDOWS\system32> $servic[20].DependentServices

Status   Name               DisplayName                           
------   ----               -----------                           
Stopped  workfolderssvc     Work Folders                          
Running  WMPNetworkSvc      Windows Media Player Network Sharin...
Running  WSearch            Windows Search                        
Stopped  embeddedmode       Embedded Mode  

Итак, вот свойства:

Status   Name               DisplayName etc...

$ servic [20] .DependentServices будет аналогично $ obj [2]. Поля в вашем случае. Попробуйте увидеть ключи или свойства в $ obj [2]. Поля, затем решите, какое свойство вы хотите от l oop до

, вы можете получить это с помощью

$obj[2].Fields | get-Module (this will give all parameters)

Затем вы может l oop через необходимые свойства, например, в моем случае:


foreach ($echserv in $servic[0-2])
    {
        write-host "*****************Service******************"
        echo $echserv.Name
        Write-Host "####DependentServices####"
        foreach ($echDependServic in $servic.DependentServices.DisplayName)
            {

                echo $echDependServic
            }
    }

, который даст результат:

*****************Service******************
XboxGipSvc
####DependentServices####
Smartlocker Filter Driver
Agent Activation Runtime_ea2d3
Agent Activation Runtime
Windows Audio
Agent Activation Runtime_ea2d3
Agent Activation Runtime
Xbox Live Networking Service
.
.
.

Надеюсь, это поможет с вашей проблемой.

PS: есть более эффективные способы отображения вывода с использованием хэш-таблиц в Powershell. Позже его можно использовать для экспорта в CSV и т. Д. c ..

0 голосов
/ 18 июня 2020

Учитывая объект, который выглядит так на JSON:

[{
    "Name": "audit_event",
    "UUID": "c6479a6f-f1bd-4759-9881-fcb493821aff",
    "Timestamp": "17-06-20 13:30:48 +00:00",
    "Fields": [["audit_schema_version", 1], ["event_time", "17-06-20 13:30:48 +00:00"], ["sequence_number", 1], ["action_id", 541934402]],
    "Actions": {}
}]

(вы можете сгенерировать это, используя $obj | ConvertTo-Json, чтобы было легче воспроизвести другим)

Сначала мы l oop через список $obj, передав его в ForEach-Object или % для краткости. Для каждого элемента мы создаем объект $result, который содержит все данные, кроме свойства Fields.

Затем мы l oop через свойство fields объекта. Каждое поле само по себе является списком, где первый (0) элемент - это имя, а второй (1) - значение. Для каждого поля мы добавляем свойство к объекту $result с именем и значением поля.

Когда это будет сделано, мы возвращаем объект $result в конвейер, и это передается Export-Csv, который записывает его в файл.

$obj | % {
    $result = $_ | Select-Object * -ExcludeProperty Fields

    $_.Fields | % {
        $result | Add-Member -Name $_[0] -Value $_[1] -MemberType NoteProperty
    }
    return $result
} | Export-Csv -Path C:\test.csv -Encoding UTF8 -NoTypeInformation
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...