Jeśli miałbym wytypować, co najczęściej używam w swoich skryptach to postawiłbym na ciągi znaków, stąd przegląd niuansów klasy System.String dostępnej w PowerShell.

Zaczynamy.

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 właściwość 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, gwarantując, że wszystkie elementy tej tablicy są dokładnie tego typu.

Pojedynczy cudzysłów

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

Nie nastąpi podmiana wartości zmiennych, należy wtedy stosować podwójny cudzysłów albo łączenie ciągów tzw. 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.

Łączenie ciągów (konkatenacja)

Znakiem łączącym ciągi jest + zarówno dla pojedynczego i podwójnego cudzysłowu.

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

Mała trudność o której musisz pamiętać występuje, gdy chcesz 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 jakby 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 zawartych w ciągu.

Metody złożonego formatowania

Metodę tą również możesz wykorzystać jako sposób na łączenie ciągów. Polega ona na umieszczaniu, 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ą wcześniej tablicę.

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, podmieniania zmiennych oraz pisaniu ciągów wielowierszowych.

Ciąg wielowierszowy (nowa linia)

Istnieje kilka sposobów, jednym z nich jest wykorzystanie @" "@ o który wykorzystałem wyżej. Daje najwięcej elastyczności i jest najczęściej wykorzystywany.

Możesz użyć znaków specjalnych np. nowej linii aby „złamać” swoją treść.

Lista wszystkich znaków specjalnych:

CharacterDescription
0Null
aAlert (Beep)
bBackspace
eEscape
fForm feed
nNew line
rCarriage return
tHorizontal tab
u{x}Unicode escape sequence
vVertical tab
--%Stop parsing

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 (Replace() vs -replace)

Do zastępowania znaków możesz wykorzystać metodę 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().

Jednak operator umożliwia korzystanie 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ść.

Podsumowanie

Wpis zawiera całą moją wiedze (na dany moment) w tym konkretnym temacie. Jestem pewien, że jeszcze sporo tu brakuję, dlatego do wpisu będę starał się dodawać nowe rzeczy i liczę, że mi w tym pomożesz.

Jeśli jest coś co warto tu dodać, to daj znać w komentarzu lub pisz na maila.

22 Najważniejsze Wskazówki Pisania Skryptów PowerShell

Mateusz Nadobnik

Zachwycony językiem skryptowym Windows PowerShell. Swoją wiedzę, doświadczenia i spostrzeżenia opisuję na blogu.

read more