
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:
Character | Description |
---|---|
`0 | Null |
`a | Alert (Beep) |
`b | Backspace |
`e | Escape |
`f | Form feed |
`n | New line |
`r | Carriage return |
`t | Horizontal tab |
`u{x} | Unicode escape sequence |
`v | Vertical 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 metodyReplace()
klasyRegex
. 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.