Powershell преобразует данные в json для анализа

#powershell #parsing #powershell-7.0

Вопрос:

Я выполняю программу, которая возвращает данные в этом формате в окно:

 Name              : Computername
ID                : number
Host Name         : Hostname
Added             : date
Online            : True
Uptime            : 3 hours
Boot Time         : time
Current User      : user
IP Address        : ip
MAC Address       : mac
Time Zone         : Eastern Standard Time

Operating System
Name              : Microsoft Windows 11 Enterprise Insider Preview
Version           : 10.0.22463.1000
SP / Release      : Dev
Installed         : time
Serial Numbe      : serial
System Drive      : C
PowerShell Version: 5.1.22463.1000
IE Version        : 11.1000.22463.0
Architecture      : 64-bit
.NET Versions     : 2.0 SP 2, 3.0 SP 2, 3.5 SP 1, 4.0 Client, 4.0 Full, 4.8 (or later)

Active Directory
Path              : AD path
Description       : desc
Domain            : domain
Created           : data

System
Manufacturer      : Dell Inc.
Model             : model
Memory            : 32 GB
Serial Number     : serial
BIOS Version      : version
BIOS Manufacturer : Dell Inc.
BIOS Asset Tag    : 00000000
 

Когда я получаю тип, это:

 IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array
 

Я могу анализировать по массиву, например:

 $computerdata[0]
 

Но это то, что вернулось бы:

 Name              : Computername
 

Он хранит каждую строку в массиве.

Если я использую:

 $computerdata | ConvertTo-Json
 

Я получаю:

 [
  "Name              : Computername",
  "ID                : number",
  "Host Name         : hostname",
  "Added             : date",
  "Online            : True",
  "Uptime            : 3 hours",
  "Boot Time         : time",
  "Current User      : user",
  "IP Address        : ip",
  "MAC Address       : mac",
  "Time Zone         : Eastern Standard Time",
  "",
  "Operating System",
  "Name              : Microsoft Windows 11 Enterprise Insider Preview",
  "Version           : 10.0.22463.1000",
  "SP / Release      : Dev",
  "Installed         : time",
  "Serial Numbe      : serial",
  "System Drive      : C",
  "PowerShell Version: 5.1.22463.1000",
  "IE Version        : 11.1000.22463.0",
  "Architecture      : 64-bit",
  ".NET Versions     : 2.0 SP 2, 3.0 SP 2, 3.5 SP 1, 4.0 Client, 4.0 Full, 4.8 (or later)",
  "",
  "Active Directory",
  "Path              : AD path,
  "Description       : desc",
  "Domain            : domain",
  "Created           : data",
  "",
  "System",
  "Manufacturer      : Dell Inc.",
  "Model             : model",
  "Memory            : 32 GB",
  "Serial Number     : serial",
  "BIOS Version      : version",
  "BIOS Manufacturer : Dell Inc.",
  "BIOS Asset Tag    : 00000000"
]
 

Оттуда я не был уверен, куда идти, потому что вижу, что все равно ухватился бы за всю линию.

Как вы анализируете данные в этом формате или конвертируете их в более форматированный json?

Комментарии:

1. Похоже на результат get-контента. Я бы предложил проанализировать текст с помощью-match или преобразовать из-строки в pscustomobject, а затем экспортировать в json. Есть много вопросов о разборе журналов.

Ответ №1:

Лучшим командлетом для этого является Get-ComputerInfo

Затем вы можете передать это командлету ConvertTo-Json

 Get-ComputerInfo | ConvertTo-Json
 

Но если вам нужно собрать информацию из выходных данных вашего приложения, вы можете перенаправить выходные данные в файл, прочитать их get-content , сохранить в переменной с именем output, разделить данные двоеточием, обрезать пары ключ-значение, прежде чем хранить их в хэш-таблице, а затем преобразовать их в объект JSON. аналогично приведенному ниже…

 $output = Get-Content -Path C:output.txt
$hashObj = @{}
$hashObj2 = @{}
$category = "Host"
foreach($line in $output){
    if($line -cnotmatch ":" -and $line -ne " "){
        $category = $line
        $categoryChanged = $true
        $hashObj2 = @{}
    }
    if($line -cmatch ":"){
        $data = $line.Split(":")
        $key = $($data[0].trim(' '))
        $val = $($data[1].trim(' '))
        $hashObj2.Add("$key","$val")
        if(!($hashObj.ContainsKey($category))){
            $hashObj.Add("$category",$hashObj2)
        }
        else{
            $hashObj."$category".Add("$key","$val")
        }
        $hashObj2 = @{}
    }
}

$jsonObj = $hashObj | convertto-json
 

Комментарии:

1. Может быть, мне следовало упомянуть, что я новичок. Еще не узнал о хэшах 🙂 Но это сработало великолепно! В конце я сделал обратное преобразование из Json, а затем я могу проанализировать его так, как мне знакомо. Спасибо!