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 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, 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ú}