Tanítsuk meg a PowerShellt szöveget értelmezni! (ConvertFrom-String)

Egy érdekes új képességet hordoz a PowerShell 5.0-ban megjelent ConvertFrom-String  cmdlet. Ezzel a paranccsal el lehet magyarázni a PowerShellnek, hogy egy szöveget hogyan kell értelmezni és ez alapján objektumokká alakítja a szöveget. Nézzünk egy egyszerű példát! Itt van a következő szöveg:

$text = @"

Név: Soós Tibor

Telefon: 1234

Kor: 45

 

Név: Beléd Márton

Telefon: 9999

Kor: 23

 

Név: Vegetári János

Telefon: 3456

Kor: 39

 

Név: Fájdalom Csilla

Telefon: 9876

Kor: 25

"@

 Szeretnék ebből olyan objektumokat létrehozni, amikben az emberek a név, telefon és kor tulajdonságokkal rendelkeznek a megfelelő értékekkel. Elővehetnénk a jó öreg regex kifejezéseket, de inkább kiragadom az első két embert és elmagyarázom a PowerShellnek, hogy mi mit jelent:

$template = @"

{Ember*:Név: {Név:Soós Tibor}

Kor: {Kor:45}

Telefon: {Tel:1234}}

 

{Ember*:Név: {Név:Beléd Márton}

Kor: {Kor:23}

Telefon: {Tel:9999}}

"@

 Az információegységeket kapcsos zárójelekbe zárjuk. A nyitó kapcsos zárójel után egy címke kell álljon. Azok az egységek, amelyek rendelkeznek tulajdonságokkal, azok végén csillag van. Ráadásul ezek az egységek hierarchikusak is lehetnek, amint az majd egy későbbi példában látni fogjuk.

Itt tehát „Ember*” elemek vannak, amelyek rendelkeznek „Név”, „Kor” és „Tel” tulajdonságokkal. A magyarázatnál legalább 2 példát kell adnunk, persze minél többet és több fajtát adunk, annál hatékonyabb lesz a tanulási folyamat.

Nézzük, mit eredményez ezek után a ConvertFrom-String:

PS C:\> ConvertFrom-String -InputObject $text -TemplateContent $template

 

Ember                                    

-----                                    

{@{Név=Soós Tibor; Kor=45; Tel=1234}}    

{@{Név=Beléd Márton; Kor=23; Tel=9999}}  

{@{Név=Vegetári János; Kor=39; Tel=3456}}

{@{Név=Fájdalom Csilla; Kor=25; Tel=9876}}

Látható, hogy maga az „Ember” is tulajdonságként van az eredményként kapott objektumokban. Ha ezt kifejtjük, akkor már tényleg azt kapjuk, amire számítottunk:

PS C:\> ConvertFrom-String -InputObject $text -TemplateContent $template | Sele

ct-Object -ExpandProperty Ember

 

Név             Kor  Tel

---             ---  ---

Soós Tibor      1234 45

Beléd Márton    9999 23

Vegetári János  3456 39

Fájdalom Csilla 9876 25

Csavarjunk egyet a dolgon! Mi van akkor, ha a „Név” után a „Telefon” és a „Kor” tetszőleges sorrendben lehet:

$text = @"

Név: Soós Tibor

Telefon: 1234

Kor: 45

 

Név: Beléd Márton

Kor: 23

Telefon: 9999

 

Név: Vegetári János

Telefon: 3456

Kor: 39

 

Név: Fájdalom Csilla

Kor: 25

Telefon: 9876

"@

Az ennek megfelelő felcímkézett magyarázat a PowerShell számára ez lenne:

$template = @"

{Ember*:Név: {Név:Soós Tibor}

Telefon: {Tel:1234}

Kor: {Kor:45}}

 

{Ember*:Név: {Név:Beléd Márton}

Kor: {Kor:23}

Telefon: {Tel:9999}}

"@

 A konvertálás azonban hibát ad:

PS C:\> ConvertFrom-String -InputObject $text -TemplateContent $template | Sele

ct-Object -ExpandProperty Ember

ConvertFrom-String : ConvertFrom-String appears to be having trouble parsing y

our data using the template you've provided. We'd love to take a look at what

went wrong, if you'd like to share the data and template used to parse it. We'

ve saved these files to C:\Users\Tibi\AppData\Local\Temp\3sqoowze.jks.input.tx

t and C:\Users\Tibi\AppData\Local\Temp\3sqoowze.jks-0.template.txt - feel free

 to attach them in a mail to psdmfb@microsoft.com. We will review all submissi

ons, although we can't guarantee a response.

At line:1 char:1

+ ConvertFrom-String -InputObject $text -TemplateContent $template | Se ...

+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    + CategoryInfo          : InvalidResult: (Microsoft.Power...yFlashExtract

   ():ProgramNotFoundException) [ConvertFrom-String], ProgramNotFoundExcepti

  on

    + FullyQualifiedErrorId : ProgramNotFound,Microsoft.PowerShell.Commands.S

   tringManipulation.ConvertFromStringCommand

Elég rémisztő a hiba szövege, de a tényleges ok az, hogy nem adtunk meg neki elegendő számú (legalább 2) példát az egyes esetekre, így nem képes megállapítani a szabályszerűségeket. Segítsünk neki, definiáljunk 2-2 példát az egyes esetekre, és hogy valami értelme is legyen a dolognak vegyünk fel még néhány elemzendő adatot:

$text = @"

Név: Soós Tibor

Telefon: 1234

Kor: 45

 

Név: Beléd Márton

Kor: 23

Telefon: 9999

 

Név: Vegetári János

Telefon: 3456

Kor: 39

 

Név: Fájdalom Csilla

Kor: 25

Telefon: 9876

 

Név: Kovács Pál

Telefon: 1523

Kor: 45

 

Név: Mekk Elek

Kor: 77

Telefon: 1010

"@

 

$template = @"

{Ember*:Név: {Név:Soós Tibor}

Telefon: {Tel:1234}

Kor: {Kor:45}}

 

{Ember*:Név: {Név:Még Xy}

Telefon: {Tel:9182}

Kor: {Kor:102}}

 

{Ember*:Név: {Név:Beléd Márton}

Kor: {Kor:23}

Telefon: {Tel:9999}}

 

{Ember*:Név: {Név:Valaki Más}

Kor: {Kor:12}

Telefon: {Tel:4321}}

"@

És ennek eredménye:

PS C:\> ConvertFrom-String -InputObject $text -TemplateContent $template | Sele

ct-Object -ExpandProperty Ember

 

Név             Tel  Kor

---             ---  ---

Soós Tibor      1234 45

Beléd Márton    9999 23

Vegetári János  3456 39

Fájdalom Csilla 9876 25

Kovács Pál      1523 45

Mekk Elek       1010 77

Azaz sikerült elmagyarázni a PowerShellnek, hogy a kor és a telefon sorrendje változhat, és meg is értette.

Nézzünk egy olyan esetet, ahol az egyik tulajdonság maga is gyűjtemény!

$text = @"

Soós Tibor, okos, szép, ügyes, szerény, 45

Kiss Mihály, csúnya, buta, 23

Beléd Márton, lopós, kártékony fajta, 25

Mekk Elek, bölcs, ősz hajú, 77

"@

A fenti példában tehát a név mellett lehet akárhány tulajdonság lehet, majd a kor van a legvégén. Hogyan tudjuk ezt elmagyarázni? A lehetséges tulajdonságokat be kell foglalni egy külön csoportba és ezen belül az egyes tulajdonságok, mint ismétlődő szekvenciák, csillagos címkét kapnak:

$template = @"

{ember*:{vnév:Kiss} {knév:Mihály}, {jellem:{tul*:csúnya}, {tul*:buta}}, {[int]kor:23}}

{ember*:{vnév:Beléd} {knév:Márton}, {jellem:{tul*:lopós}, {tul*:kártékony fajta}}, {[int]kor:25}}

"@

 Ezt futtatva a következőket kapjuk:

PS C:\> $result = ConvertFrom-String -TemplateContent $template -InputObject $t

ext

PS C:\> $result

 

ember

-----

{@{vnév=Soós; knév=Tibor; jellem=; kor=45}}

{@{vnév=Kiss; knév=Mihály; jellem=; kor=23}}

{@{vnév=Beléd; knév=Márton; jellem=; kor=25}}

{@{vnév=Mekk; knév=Elek; jellem=; kor=77}}

Megint az „embert” ki kell fejteni, de itt még a „jellem” elemeket is picit át kell dolgozni, mert azok alapban így néznek ki:

PS C:\> $result.ember[0].jellem

 

tul

---

{@{Value=okos}, @{Value=szép}, @{Value=ügyes}, @{Value=szerény}}

Az egyes jellemvonásoknak nincs saját címkéjük, a „tul” az az „objektum” jelölője, ilyenkor a rendszer egy Value tulajdonságot hoz részre. Ez a következőképpen lehet beleintegrálni az emberbe, hogy kicsit kevesebb szinttel ábrázoljuk a jellemvonásokat:

PS C:\> $result.ember | Select-Object vnév, knév, kor, @{n="Jellem";e={$_.jelle

m.tul.value}}

 

vnév  knév   kor Jellem

----  ----   --- ------

Soós  Tibor   45 {okos, szép, ügyes, szerény}

Kiss  Mihály  23 {csúnya, buta}

Beléd Márton  25 {lopós, kártékony fajta}

Mekk  Elek    77 {bölcs, ősz hajú}

 

 

 

 



Word To HTML Converter