#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, а затем я могу проанализировать его так, как мне знакомо. Спасибо!