Skip Ribbon Commands
Skip to main content

Ondrej Sevecek's Blog

:

Engineering and troubleshooting by Directory Master!
Ondrej Sevecek's Blog > Posts > PowerShell psycho při hře se -split operátorem
srpen 09
PowerShell psycho při hře se -split operátorem

Za posledních několik měsíců jsem ztrávil už alespoň šest týdnů full-time práce na různých PowerShell programech. A musím říct, že už mě ten "jazyk" pěkne štve. Chová se to v mnoha případech divně. Myslím, že by víc prospělo, kdyby se nesnažili vymýšlet různé speciality a dali tomu nějakou precizní syntaxi a tím preciznější chování.

Dneska zase.

Případ -split operátoru

Rozdělování řetězců se dá udělat buď tak, že zavoláte jejich metodu .Split(). Funguje v pohodě.

Ale když v PowerShellu existuje takový pěkný operátor -split, tak jsem chtěl používat ten. A fungovalo to celou dobu bez chyby. Až do okamžiku, kdy jsem chtěl rozsekávat podle znaku $ (dolar).

A božínku, má to takovou zabudovanou "vlastnost", aby se skriptaři nenudili. Neumí to na první pohled rozsekávat pomocí oddělovače $ (dolar). A ještě se to chová chaoticky podle typu vstupního řetězce. Zkuste si tohle:

"text bez dolaru" -split '$'
'text bez dolaru' -split '$'
'text bez dolaru' -split '`$'
'text s $ dolarem' -split '$'
'text s $ dolarem' -split '`$'

Jediný případ, při kterém to fungovalo alespoň trošku korektně, je případ číslo tři. Ve všech ostatních se to chová jako idiot. Bóže.

Ve skutečnost je správně použít zpětné lomítko (backslash):

'text s $ dolarem' -split '\$'

Proč? On totiž -split operátor pracuje ve výchozím stavu s regulárními výrazy (RegExMatching). To je totiž zřejmě opravdu intuitivní. Každý skriptař to na první pohled ví. A pokud to ten naivka třeba neví, tak si to může vypsat v nápovědě - je to na konci té šesté stránky popisku:

get-help about_split

Takže mě to zase stálo cca dvě hodiny práce, přijít na to, proč mě nefunguje jedna úplně "intuitivní" funkce. Hlavně, že to skriptování má šetřit práci.

 

Comments

Re: PowerShell psycho při hře se -split operátorem

Hmmm... Narozdíl ode mne jsi to dotáhl do konce. Já se netrápil se znakem '$', ale se znakem '|'. Vyzkoušej si, taky je to docela překvapení, co to udělá. Backslash jsem nakonec nezkusil, šel jsem onehdy jinou cestou. Ale teď jsem to okamžitě otestoval a... je to tam. :-)
Jinak super přednášky na TechEdu - něco jsem znal, hodně bylo nového, díky.
Keshiiiboss on 1.6.2013 4:25

Re: PowerShell psycho při hře se -split operátorem

diky za chvalu.

to věřím, svislítko ("nebo") musí být ještě větší peklo :-)
ondass on 2.6.2013 10:44

Add Comment

Title


Pole Title nemusíte vyplňovat, doplní se to samo na stejnou hodnotu jako je nadpis článku.

Author *


Pole Author nesmí být stejné jako pole Title! Mám to tu jako ochranu proti spamu. Roboti to nevyplní dobře :-)

Body *


Type number two as digit *


Semhle vyplňte číslici dvě. Předchozí antispemové pole nefunguje úplně dokonale, zdá se, že jsou i spamery, které pochopily, že je občas potřeba vyplnit autora :-)

Email


Emailová adresa, pokud na ni chcete ode mě dostat odpověď. Nikdo jiný než já vaši emailovou adresu neuvidí.

Attachments