Wszystko, co powinieneś wiedzieć o ciągach znaków w Powershell

W skryptach często wykorzystywane są ciągi znaków, stąd poniższy przegląd niuansów klasy System.String dostępnej w PowerShell.

Pojedynczy cudzysłów

Zawarcie ciąg znaków w pojedynczych cudzysłowach powoduję przekazanie ciągu do zmiennej dokładnie tak, jak zostało to wpisane.

Nie następuje podmiana wartości zmiennych, należy wtedy stosować podwójny cudzysłów albo łączenie ciągów (konkatenacja).

Podwójny cudzysłów

Po zawarciu łańcucha w podwójny cudzysłów (ciąg znaków podwójnie cytowany), nazwy zmiennych poprzedzone znakiem dolara ($) są zastępowane wartością zmiennej przed przekazaniem łańcucha do polecenia przetwarzania.

Deklarowanie typu zmiennej

PowerShell nie wymaga rzutowania typu zmiennej, pierwsze zastosowanie zmiennej określa jego typ. Tak, więc $messege będzie typu String, tak samo jakbyśmy jawnie rzutowali typ zmiennej w sposób [string]$message.

Inaczej wygląda sytuacja dla tablic znakowych. W jednym i drugim przypadku zmienne dziedziczą z System.Array jednak dla jednej Name wskazuje Object[] a dla drugiej String[].

Niesie to za sobą konsekwencje przy późniejszym dodawaniu kolejnych elementów do tabilicy. String[] dokonuję niejawnej konwersji do typu System.String. Gwarantuje to, że wszystkie elementy tej tablicy są dokładnie tego typu.

Łączenie ciągów znaków czyli konkatenacja

Znakiem łączącym ciągi jest + zarówno dla pojedyńczego i podwójnego cudzysłowu

Mając jednak na uwadzę właściwość podmieniania zmiennych dla podwójnego cudzysłowu prościej napisać.

Mała trudność występuje, gdy chcemy wyświetlić w ciągu znaków wartość właściwości.

Przy takim zapisie nazwa właściwości (.Version) jest traktowana tylko jako ciąg znaków. Natomiast przy podmianie zmiennej następuję niejawna konwersja do ciągu znaków, w rezultacie zwracany jest typ obiektu (choć nie zawsze). To tak jaby zostało wywołane [string]$host.

Do poprawnego wyświetlenia wartości w ciągu znakowym należy zastosować $().

Taki zapis umożliwia również wykonywanie operacji zawarych w ciągu.

Metody złożonego formatowania

Metoda ta to również sposób na łączenie ciągów polega na umieszczanie, indeksowych znacznikami takich jak {0}, {1}, {n+1} które następnie zastępowane są odpowiednimi obiektami z listy.

Istnieją dwa sposoby obsługi takiego formatowania. Użyciu statycznej metody Format() klasy System.String lub skorzystanie z operatora formatu -f.

Jako listę obiektów możemy również wykorzystywać zdefiniowaną tablicę.

Więcej na temat opcji formatowania można znaleźć w dokumentacji.

Cudzysłów, jako znak ciągu

Niekiedy trzeba umieścić znaki cudzysłowu w ciągu, aby sobie z tym poradzić mamy kilka możliwości.

Pierwszy sposób to zdublowanie cudzysłowu w wymaganym miejscu.

Bez problemów można zawrzeć pojedynczy cudzysłów w ciągu określonym podwójnymi cudzysłowami i odwrotnie.

Ostatnim sposobem jest umieszczenie ciągu w @""@co daje sporą swobodę w stosowaniu cudzysłowów, ale również podmieniania zmiennych.

Złamanie ciągu czyli nowa linia

Możemy „złamać” nasz komunikat wstawiając nowa linie za pomocą znaku `n

Działania na ciągach

Obiekty klasy System.String dostarczają nam pewny zbiór metod które umożliwiają nam typowe przekszałcenia  i działania na ciągach.

Wielkość znaków

Metoda ToUpper() umożliwia przekonwertowanie wszystkich znaków w ciągu na ich wielkie odpowiedniki, natomiast ToLower() odwrotnie, zamienia wszystkie znaki na małe.

Usuwanie

Remove() zwraca nowy ciąg znaków, w który zostaje usunięta określona liczba znaków, rozpoczynając od określonej pozycji. Brak podania liczby znaków powoduję usunięcie wszystkiech znaków od określonej pozycji.

Trim(), TrimEnd(), TrimStart()użyteczne przy okazji usuwania białych znaków lub pojedyńczych niechcianych znaków.

Metoda Substring() co, prawda nie służy tyle do usuwania co wyodrębniania konkretnego elementu ciągu, jednak w ten sposób pozbywamy się zbędnego łańcucha znaków. Jako parametry musimy określić pozycje, opcjonalnie również długość ciągu, którą ma zostać zwrócona.

Dzielenie ciągu

Metoda Split() klasy System.String służy do dzielenia łańcucha znaków na tablicę. Najprostsze zastosowanie tej metody to podanie separatora dzielenia.

Oprócz metody do dzielenia można posłużyć się dostępnym w PowerShell operatorem -split.

Z znacznych różnic pomiędzy metodą a operatorem jest taka, że dla metody możliwe jest określenie tablicy separatorów.

Natomiast dla operatora -split w składni możliwe jest podanie bloku skryptu {<ScriptBlock>}czego nie zrobimy stosując metodę.

Metoda Split() oprócz parametru separatora przyjmuję inne parametry, dokładniejsze omówienie wraz z przykładamy pod tym linkiem. Również operator -split posiada swoje niuanse, które zostały dobrze opisane w dokumentacji.

Zastępowanie znaków, różnica pomiędzy Replace() -replace

Do tego celu dostępna metoda Replace() klasy System.String. Metoda ta przyjmuje dwa parametry, starą wartość (znak lub ciąg) oraz nową wartość.

Istnieje również operator -replace, który może wydawać się tylko innym sposobem wywołania ww. metody Replace().

Operator umożliwia krzystanie z wyrażeń regularnych czego nie oferuję metoda Replace()

Alternatywą dla operatora -replace jest skorzystanie z statycznej metody Replace() klasy Regex. Pod tym względem dostarczają identyczną funkcjonalność.

cdn…

Jest jeszcze kilka kwestii które zostaną tutaj dopisane, jak chociażby porównywanie ciągów.

 

Z pasją poświęcam czas na zdobywanie wiedzy w zakresie szeroko rozumianej Data Platform. Zachwycony językiem skryptowym Windows PowerShell. Swoją wiedzę, doświadczenia i spostrzeżenia opisuję na blogu.

Leave a Reply

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *