OffTopic
ogólnie staram się szanować nasz piękny język i tępić 'kontenty’ czy 'autentykację’ [choć pewnie lada moment zostaną zapisane jako oficjalnie poprawne]. niemniej tłumaczenia niektórych fraz brzmią … zabiera trochę czasu, żeby się domyślić /: to na tyle jeśli w kwestii filozofii porannej, czas na gimnastykę z innego języka.
PS case sensivity
PS jest miły i przyjemny. stara się użytkownika we wszystkim wyręczyć, pomóc mu, wybaczyć błędy. czasem aż do przesady. ale jak każda istota, ma swoje odchyły, aberracje. tak też jest w przypadq traktowania wielkości znaków – ogólnie wszystko, dla ułatwienia, jest z automatu niewrażliwe na wielkości znaków. czyli mówiąc potocznie, jest baj difolt kejs-insensitive. są jednak wyjątki [bez których reguła nie mogłaby być pełna]:
- najbardziej zdradliwe, bo też i często używane, to ’-unique’. z jednej strony logiczne, że unikalne ma być unikalne… z drugiej, skoro PS jest nieczuły na stan [prawda, że też ładne tłumaczenie?], to skąd nagle taka zmiana…
C:\...ive\_ScriptZ :))o- $PS='nExoR','nexor','Nexor' C:\...ive\_ScriptZ :))o- $PS|select -Unique nExoR nexor Nexor
jak widać, każdy =))o- jest unikalny. rozsądnie. tak samo zresztą zachowuje się polecenie 'get-unique’, a mogłoby się wyróżniać choćby dodatkowym parametrem ’-CI’. ale się nie wyróżnia.
na każdego jest oczywiście metoda, tzw. walec. takim walcem w PS jest sortowanie, które również posiada parametr ’-unique’, ale ten unique jest bardziej unique niż inne, bo jest właśnie nieczuły na wielkość:
C:\...ive\_ScriptZ :))o- $PS|sort -Unique Nexor
[to nie jest prawidłowy =))o- ]
- drugim przykładem, zapewne bardziej [nomen omen] unikalnym, są wyrażenia regularne. oczywiście i tutaj są dwie wariacje – CI i CS, więc trzeba uważać. jeśli używa się zwykłych reguł 'match’ lub 'replace’, zachowuje się standardowo [czyli nie zwraca uwagi na wielkość znaków]:
C:\...ive\_ScriptZ :))o- $PS='nExoR jest Niewrażliwy Na Walizki' C:\...ive\_ScriptZ :))o- $PS -match 'nexor' True
jeśli jednak zdefiniuje się wyrrega [tak pewnie nazywał by się w polskiej wersji Logo. tłumaczone języki to sqcha] … regexa, to zachowuje się inaczej [czyli CS]:
C:\...ive\_ScriptZ :))o- $PS='nExoR jest Niewrażliwy Na Walizki' C:\...ive\_ScriptZ :))o- [regex]$rxeN="nexor" C:\...ive\_ScriptZ :))o- $PS -match $rxeN False
zmusić regexa do niewrażliwości można na dwa sposoby – albo definiując dodatkową opcję podczas deklaracji, lub modyfiqjąc samą definicję wyrażenia. pierwsza wersja może przestraszyć swoją monstrualnością, ale jak się w kodzie definiuje wiele regexów to warto raz zdefiniować i potem używać:
C:\...ive\_ScriptZ :))o- $PS='wyczUleniE na poKrowce to nie nExoR' C:\...ive\_ScriptZ :))o- $rxOptCI = ([System.Text.RegularExpressions.RegexOptions]::IgnoreCase -bor [System.Text.Regular Expressions.RegexOptions]::Compiled) C:\...ive\_ScriptZ :))o- $rxeN=New-Object System.Text.RegularExpressions.Regex("nexor",$rxOptCI) C:\...ive\_ScriptZ :))o- $PS -match $rxeN True
opcje są wartością binarną, której każdy bit ma inne znaczenie. stąd binarny OR modyfiqjący jej wartość. jeśli wyrażeń regularnych w kodzie jest niewiele, bardziej opłaca się CI ustawić w jego definicji:
C:\...ive\_ScriptZ :))o- $PS='deLikAtny ProCeS nExoRa' C:\...ive\_ScriptZ :))o- [regex]$rxeN="(?i)nexor" C:\...ive\_ScriptZ :))o- $PS -match $rxeN True
PostScriptum
znajomość sztuczek i tricków języka jest bardzo przydatna. można zaoszczędzić wiele linii kodu, a czasem bardzo wiele czasu, zmarnowanego na wyważanie otwartych okien. polecam również zajrzeć na powershellpl.net, ponieważ Bartek się w końcu uaktywnił.
eN.