opsec2022
Goto Top

Powershell: String aus Text oder ps1 Output Extrahieren

Hallo,

folgende Text File bzw. den Output eines ps-Skript würde ich gerne auf die Value von returnResult reduzieren bzw returnResult als $result hinterlegen.
Caption           : Intel64 Family 6 Model 58 Stepping 9
DeviceID          : CPU0
Manufacturer      : GenuineIntel
MaxClockSpeed     : 3401
Name              : Intel(R) Core(TM) i7-3770 CPU @ 3.40GHz
SocketDesignation : CPU 1

{"returnCode":1,"returnReason":"Processor, ","logging":"Storage: OSDiskSize=224GB. PASS; Memory: System_Memory=8GB. PASS; TPM: TPMVersion=Undetermined. UNDETERMINED; Zum Ausführen dieses Befehls sind Administratorberechtigungen erforderlich.; Processor: {AddressWidth=64; MaxClockSpeed=3401; NumberOfLogicalCores=8; Manufacturer=GenuineIntel; Caption=Intel64 Family 6 Model 58 Stepping 9; }. FAIL; SecureBoot: Undetermined. UNDETERMINED; UnauthorizedAccessException Es konnten keine ordnungsgemäßen Berechtigungen festgelegt werden. Zugriff verweigert.; ","returnResult":"NOT CAPABLE"}




Das Skript:

$ip = Get-NetIPAddress -AddressFamily IPv4 -InterfaceIndex $(Get-NetConnectionProfile | Select-Object -ExpandProperty InterfaceIndex) | Select-Object -ExpandProperty IPAddress
$dirpath = "\\server\dir\"
$ultpath = "\\server\dir\output\output.txt"
Push-Location $dirpath
& \\server\dir\HardwareReadiness.ps1 | Out-String $result
$ip + $result >> \\server\dir\output\output.txt

Ein Ansatz war Substring($string.length - 2, 12), jedoch ist hier .length 12, was sich mir nicht erschließt.

Hat hier jemand eine Idee?

Gruß

OpSec

Content-Key: 3132395454

Url: https://administrator.de/contentid/3132395454

Printed on: June 11, 2023 at 03:06 o'clock

Member: MrCount
MrCount Jun 21, 2022 at 09:43:31 (UTC)
Goto Top
Servus,

du kannst z.B. mit

$pos_start = $result.IndexOf('returnResult":"')
$pos_end = $result.IndexOf('"}',$pos_start)

die Positionen bestimmen, und dann den Inhalt einlesen

$message = $result.substring($pos_start + 15, $pos_end)
Member: colinardo
colinardo Jun 21, 2022 updated at 16:09:06 (UTC)
Goto Top
Servus.
Zeile 9 ist JSON das brauchst du nicht als String parsen, das ist ehrlich gesagt anno 1980.

Also passe am besten gleich dein Powershell Skript welches diese Zeile ausliest so an das es den JSON-String in ein Object verwandelt (ConvertFrom-Json) dann kannst du ohne Regex oder Substring direkt und zuverlässig darauf zugreifen
$jsonstring = '{"returnCode":1,"returnReason":"Processor, ","logging":"Storage: OSDiskSize=224GB. PASS; Memory: System_Memory=8GB. PASS; TPM: TPMVersion=Undetermined. UNDETERMINED; Zum Ausführen dieses Befehls sind Administratorberechtigungen erforderlich.; Processor: {AddressWidth=64; MaxClockSpeed=3401; NumberOfLogicalCores=8; Manufacturer=GenuineIntel; Caption=Intel64 Family 6 Model 58 Stepping 9; }. FAIL; SecureBoot: Undetermined. UNDETERMINED; UnauthorizedAccessException Es konnten keine ordnungsgemäßen Berechtigungen festgelegt werden. Zugriff verweigert.; ","returnResult":"NOT CAPABLE"}'
($jsonstring | ConvertFrom-JSON).returnResult
Wenn du die JSON-Zeile aus einer vorhandenen LOG-Datei auswerten willst in der auch noch andere Sachen stehen wie von dir oben gezeigt, dann so
$logfile = 'D:\output.txt'
$returnResult = [regex]::match((gc $logfile -raw),'(?m)^\{.+}').Value | ConvertFrom-JSON | select -Expand returnResult
$returnResult
Rein über regex lässt sich das natürlich auch machen würde aber über den Weg über das JSON Object präferieren.
$logfile = 'D:\output.txt'
$returnResult = [regex]::match((gc $logfile -raw),'(?i)(?<="returnResult":")[^"]*').Value
$returnResult

Grüße Uwe