2017-09-27 2 views
1

Je suis en train d'analyser du code HTML à partir d'un serveur Web (en particulier un contrôleur Fanuc) et d'affecter le innerText à un objet.Analyse et modification d'un objet PowerShell

#Make sure the controller respons 
if ($webBody.StatusCode -eq 200) { 
    Write-Host "Response is Good!" -ForegroundColor DarkGreen 
    $preBody = $webBody.ParsedHtml.body.getElementsByTagName('PRE') | Select -ExpandProperty innerText 
    $preBody 
} 

La sortie ressemble un peu à ceci:

[1-184 above] 
    [185] = 0 '' 
    [186] = 0 '' 
    [187] = 0 '' 
    [188] = 0 '' 
    [189] = 0 '' 
    [and so on] 

Je veux seulement lire les données de 190, 191, 193 par exemple. Quelle est la meilleure façon de faire cela? J'ai du mal à assainir les données indésirables dans l'objet.

Actuellement, j'ai une application vbscript qui sort dans un fichier txt, nettoie les données puis les relit et les manipule dans un insert sql. J'essaie d'améliorer avec powerhell et désireux d'essayer et de garder tout dans le programme si possible.

Toute aide grandement appréciée.

Répondre

2

En supposant que l'ensemble de données n'est pas trop grand pour tout placer en mémoire. Vous pouvez analyser avec regex dans un objet PowerShell, puis vous pouvez utiliser Where-Object pour filtrer.

#Regex with a capture group for each important value 
$RegEx = "\[(.*)\]\s=\s(\d+)\s+'(.*)'" 
$IndexesToMatch = @(190, 191, 193) 
$ParsedValues = $prebody.trim | ForEach-Object { 
    [PSCustomObject]@{ 
     index = $_ -replace $regex,'$1' 
     int = $_ -replace $regex,'$2' 
     string = $_ -replace $regex,'$3' 
    } 
} 
$ParsedValues | Where-Object { $_.index -in $IndexesToMatch } 

Entrée:

[190] = 1 'a' 
[191] = 2 'b' 
[192] = 3 'c' 
[193] = 4 'd' 
[194] = 5 'e' 

Sortie:

index int string 
----- --- ------ 
190 1 a 
191 2 b 
193 4 d 
+0

Merci pour montrer cela, je ne ai jamais pensé à l'aide d'un objet withing remplacer personnalisé avant. Va le mettre en signet pour référence future. – Snak3d0c