leex01
Goto Top

Powershell ungewollte Konvertierung

Hi zusammen,

ich möchte mit der Powershell einen string in ein Objekt konvertiern, das klappt auch soweit mit ConvertFrom-String aber dabei finden ungewollte Konvertierungen statt.

Im Original "0/0", "1/1", "2/2" kommt raus als "0/0" (das kann sie ja nicht in eine Datum umwandeln, "1/1" wird zu "01.01.2020 00:00:00" und "2/2" zu "02.02.2020 00:00:00".

Kennt jemand eine einfache Möglichkeit das zu verhindern?

Danke schon mal

Content-Key: 597456

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

Printed on: April 25, 2024 at 04:04 o'clock

Mitglied: 145033
145033 Aug 19, 2020 updated at 12:06:40 (UTC)
Goto Top
Dafür hat das CMDlet den Parameter -TemplateContent
https://petri.com/powershell-5-0-tutorial-example-driven-parsing-using-c ...
Da kannst du auch Datentypen vordefinieren...

Beispiel:
$template = @'  
{[string]Nummer*:0000000},{[string]Wert:1/1}
{[string]Nummer*:9999999},{[string]Wert:9/9}
'@  

@'  
012345,1/1
678901,2/2
678901,3/3
'@ | ConvertFrom-String -TemplateContent $template  
Du kannst natürlich auch selbst mit ner Schleife parsen und deine Objekte erstellen, da hast du dann auch volle Freiheiten und musst dich nicht auf den MS Parser verlassen. Oder ConvertFrom-StringData oder Import-CSV nutzen je nachdem wie deine Daten eben so aussehen.
Member: LeeX01
LeeX01 Aug 19, 2020 at 12:22:27 (UTC)
Goto Top
Hi Kleiber,

das hatte ich gefunden finde es aber unheimlich kompliziert. Da bin ich lange beschäftigt bis ich alle Spalten und verschienen Möglichkeiten definiert habe, das isst keine befriedigende Lösung.

Grüße
Mitglied: 145033
145033 Aug 19, 2020 updated at 12:33:04 (UTC)
Goto Top
Da bin ich lange beschäftigt bis ich alle Spalten und verschienen Möglichkeiten definiert habe
Das ist oft nicht nötig, meist reicht es mindestens zwei Variationen anzugeben. Der Parser interpretiert dann die Zwischenschritte.

Wie sehen deine Daten denn überhaupt in Rohform aus? Es kann ja sein das es sich eher Import-CSV oder ConvertFrom-StringData oder auch ne Foreach-Schleife anbieten würde, aber ohne den Aufbau deiner Datei vorliegen zu haben, kann ich dir kein Beispiel anbieten ...
Member: LeeX01
LeeX01 Aug 19, 2020 at 12:36:18 (UTC)
Goto Top
0/0 RAID6 Optl RW Yes RWTD - ON 123.184 TB Name1
1/1 RAID6 Optl RW No RWTD - ON 5.276 TB Irgendwas_23
2/2 RAID6 Optl RW Yes RWTD - ON 65.481 TB VDName

so z.B. als geschnittener Output vom storcli, auf anderen Servern natürlich wieder etwas anders
Die Bedeutungen sind
DG/VD TYPE State Access Consist Cache Cac sCC Size Name

Danke schon mal für die Hilfe
Mitglied: 145033
145033 Aug 19, 2020 updated at 12:41:03 (UTC)
Goto Top
Das ist simpel, da fehlt aber nen SpaltenHeader bei deiner Angabe wenn Leerzeichen dein Delimiter sind ...
@'  
0/0 RAID6 Optl RW Yes RWTD - ON 123.184 TB Name1
1/1 RAID6 Optl RW No RWTD - ON 5.276 TB Irgendwas_23
2/2 RAID6 Optl RW Yes RWTD - ON 65.481 TB VDName
'@ | ConvertFrom-CSV -Delimiter " " -Header 'DG/VD','TYPE','State','Access','Consist','Cache','Cac','sCC','Size','Name','Name2'  
Member: LeeX01
LeeX01 Aug 19, 2020 updated at 12:51:09 (UTC)
Goto Top
da sind leider eine beliebige Zahl Spaces zwischen den Spalten (die wurden beim hier rein kopieren gelöscht) und bei der Größe oder auch beim Namen sind in der Spalte "123.184 TB" Leerzeichen.
Mitglied: 145033
Solution 145033 Aug 19, 2020 updated at 12:55:47 (UTC)
Goto Top
Dann wirst du nicht drum herum kommen genau zu definieren was zu was zu welcher Spalte gehört...
 gc .\file.txt | %{
    $cols = $_ -split '\s+'  
    [pscustomobject]@{
        'DG/VD'=$cols  
        'TYPE'=$cols[1]  
        'State'=$cols[2]  
        'Access'=$cols[3]  
        'Consist'=$cols[4]  
        'Cache'=$cols[5]  
        'Cac'=$cols[6]  
        'sCC'=$cols[7]  
        'Size'=$cols[8..9] -join ' '  
        'Name'=$cols[10..1000] -join ' '  
    }
}
Evt. weitere Differenzierung via Regex.

Welcher Depp liefert solche Datenstrukturen ??
Member: LeeX01
LeeX01 Aug 19, 2020 updated at 12:59:19 (UTC)
Goto Top
Das funktioniert perfekt, vielen Dank!

Würde ich dir sagen aber komme da nicht mehr hinterher ob die nun Avago, LSI, Broadcom oder sonsst irgendwie heißen. face-smile