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-ID: 3132395454

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

Ausgedruckt am: 08.11.2024 um 01:11 Uhr

colinardo
colinardo 21.06.2022 aktualisiert um 18:09:06 Uhr
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
MrCount
MrCount 21.06.2022 um 11:43:31 Uhr
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)