PowerShell – mini kompendium

PowerShell script

Parę dni temu musiałem napisać w PowerShellu skrypt konserwacyjny, który miał za zadanie zapisywać stan systemu do paczki i odtwarzać wcześniej zapisany stan. Zadanie samo w sobie było proste, jednak pochłonęło około 2,5 dnia.

Nieznajomość składni i komend dostępnych w Powershellu miały decydujący wpływ na tak dużą czasochłonność. Oczywiście wszystko, czego potrzebowałem, udało mi się znaleźć w sieci. Niestety po drodze musiałem przejrzeć pierdyliard najróżniejszych stron.

W związku z tym postanowiłem spisać pewne rzeczy, ponieważ niewykluczone, że ja, lub ktoś inny, będzie musiał w przyszłości naskrobać coś w PowerShellu. Wierzę, że podręczne kompendium może być wtedy nieocenione. Mi osobiście czegoś takiego brakowało.

Przedstawione poniżej komendy i przykłady zostały przeze mnie przetestowane i wykorzystane w praktyce. Należy wiedzieć, że w wielu przypadkach istnieją alternatywne drogi do osiągnięcia tych samych rezultatów, jednak celem tego wpisu nie jest wylistowanie wszystkich możliwych rozwiązań w każdej poruszonej dziedzinie.

Przekazywanie parametrów do skryptu

Przykład użycia:

Najważniejsze informacje:

    1. Parametry wejściowe do skryptu definiujemy wewnątrz bloku Param().
    2. Adnotacja [CmdletBinding()] to marker informujący o tym, że poniżej wykorzystano zaawansowane funkcje dotyczące parametrów lub metod.
    3. Typy parametrów definiujemy w nawiasach kwadratowych np. [string].
    4. Adnotacja [Parameter] pozwala na wprowadzenie dodatkowych informacji o parametrze np. Mandatory=$True wskazuje, że parametr jest wymagany. Domyślnie parametry są niewymagane.
    5. Adnotacja [Alias] pozwala podać alias dla parametru. W powyższym przypadku wywołanie skryptu z parametrem –param2 wartość lub –p2 wartość będzie równoznaczne.
    6. Typ [switch] definiuje parametr jako przełącznik. Jeżeli wywołamy skrypt z parametrem –param3 wtedy zmienna $param3 będzie miała wartość $True. W przeciwnym razie pod zmienną $param3 znajdziemy wartość $False.
      Info: wartości logicznych true, false oraz wartości null używamy ze znakiem $ na początku.

Nawigacja po Zasobach / przeglądanie zawartości

Informacja: W PowerShellu wiele rzeczy, m. in. katalogi, pliki, serwer baz danych!, usługi, jest zasobem, dlatego poniższe komendy mają większy zasięg i użyteczność niż ich odpowiedniki w zwykłej linii komend.

  1. Zmiana bieżącej lokalizacji np. Set-Location c:, ale też Set-Location SQLSERVER:. Alias komendy: sl.
  2. Przeglądanie zawartości np. Get-ChildItem c:, ale też Get-ChildItem SQLSERVER:. Alias komendy: dir.
  3. Pobieranie bieżącej lokalizacji: Get-Location. Alias komendy: pwd.
  4. Nawigowanie po ścieżkach w SQL Server: http://technet.microsoft.com/en-us/library/hh213536.aspx.
  5. Parsowanie ścieżki URN do zasobu w SQL Server: http://technet.microsoft.com/en-us/library/hh213473.aspx.
Wyświetlanie informacji na konsolI

Przykłady:

Najważniejsze informacje:

  1. Funkcja Write-Host wyświetla biały tekst na konsolę. Dodatkowe atrybuty: –foregroundcolor oraz –backgroundcolor pozwalają na zmianę koloru czcionki (-foregroundcolor) oraz tła (-backgroundcolor).
  2. Funkcja Write-Warning to w zasadzie alias dla Write-Host “test” –foregroundcolor Yellow –backgroundcolor Black, może się przydać do wyświetlania ostrzeżeń.
  3. Wywołanie $Host.UI.WriteErrorLine(“test”) to alternatywa dla Write-Error – nie wiem dlaczego, ale Write-Error u mnie nie działało. Jak nietrudno się domyślić Funkcja służy do wyświetlania komunikatów o błędach.
  4. W palecie jest tylko 16 kolorów, są to podstawowe kolory w różnych odcieniach (Black, DarkBlue, DarkGreen, DarkCyan, DarkRed, DarkMagenta, DarkYellow, Gray, DarkGray, Blue, Green, Cyan, Red, Magenta, Yellow, White).
Wyświetlanie komunikAtów w Osobnym Okienku (popupie)

Przykłady:

Najważniejsze informacje:

  1. PowerShellu umożliwia ładowanie zewnętrznych bibliotek np. z .NET Framework. Dzięki temu możemy np. wykorzystać MessageBoxa do wyświetlania komunikatów.
  2. Chcąc skorzystać z jakiejś dllki wystarczy podać tylko pełny namespace, PowerShell sam sobie zaciągnie odpowiednią dllkę z GACa.
  3. W PowerShellu nie ma usingów, zamiast tego możemy przypisać namespace do zmiennej i możemy z niej korzystać jak z typu (przykład 2).
Łączenie stringów

Przykłady:

Najważniejsze informacje:

  1. Łańcuchy znaków można łączyć na co najmniej 3 sposoby.
  2. Opcja 1 pomimo swojej prostoty nie zawsze się sprawdza. Kilka razy zdarzyło mi się, że w bardziej złożonych przypadkach, gdzie np. zmienna była wrzuca w środek stringa, na wyjściu dostawałem niekoniecznie to, co chciałem. Wszystkie problemy udało mi się rozwiązać korzystając z metod 2 i 3.
  3. Z funkcji [string]::Format() korzysta się tak samo jak w .NET Framework.
Instrukcje warunkowe i operatory porównań

Przykład:

Najważniejsze informacje:

  1. W przypadku instrukcji elseif nie oddzielamy obu słów spacją tak jak w C#.
  2. W warunkach używamy następujących operatorów porównań:
    Operator Opis
    -eq Równe
    -ne Różne
    -lt Mniejsze niż
    -gt Większe niż
    -ge Większe bądź równe
    -le Mniejsze bądź równe
    -ieq Równe (case-insensitive)
    -ceq Równe (case-sensitive)
    Info: Operatory –ieq oraz –ceq dotyczą tylko porównań na stringach.
  3. Dostępne operatory logiczne:
    Operator Opis
    -not Negacja
    ! Negacja (wersja skrócona)
    -and Koniuncja (odpowiednik &&)
    -or Alternatywa (odpowiednik ||)
Konwersja typów

Przykłady:

Najważniejsze informacje:

  1. Nie musimy jawnie podawać typu zmiennej tj. [string] $test = “12” jest równoznaczne z $test = “12”.
  2. Do weryfikacji typów możemy skorzystać z operatora –is lub metody gettype().
  3. W PowerShellu wszystko jest obiektem, dlatego nawet na typie prostym np. int możemy wywołać metodę gettype().
  4. Do konwersji możemy również wykorzystać metody dostępne w C#.
Praca z plikami i folderami

Przykłady:

Najważniejsze informacje:

  1. Do testowania ścieżek do plików lub folderów korzystamy z funkcji Test-Path.
  2. Do tworzenia plików i folderów używamy komendy New-Item wskazując odpowiedni typ obiektu przełącznikiem –ItemType. Ścieżkę docelową podajemy z parametrem –Path.
  3. Usuwanie plików i folderów umożliwia komenda Remove-Item.
  4. Usuwanie plików i folderów umożliwia komenda Copy-Item.
  5. Przełącznik Out-Null kasuje wyjście zamiast wyświetlenia go na konsolę.
  6. Komenda Split-Path umożliwia m. in. wyciąganie informacji ze wskazanej ścieżki takich jak ścieżka bazowa, czy nazwa pliku.
Obsługa wyjątków

Najważniejsze informacje:

  1. Obsługa wyjątków wygląda podobnie jak w C#, tutaj też mamy bloki try, catch i finally.
  2. Własne wyjątki rzucamy za pomocą throw.
  3. Obiekty tworzymy za pomocą operatora new-object.
  4. Jeżeli chcemy wskazać konkretny typ wyjątku obsługiwany przez blok Catch to robimy to po spacji w nawiach kwadratowych np. Catch [System.ArgumentException]
  5. Niektóre funkcje np. Get-Content, Invoke-SqlCmd nie przerywają działania skryptu po wystąpieniu błędu. Możemy zmienić to zachowanie podając do wywołania dodatkowy przełącznik: –ErrorAction ‘Stop’.
  6. Do obiektu wyjątku dostajemy się przez zmienną $_. Ta zmienna reprezentuje obiekt w bieżącym kontekście.

    $_ is the current pipeline object; used in script blocks, filters, the process clause of functions, where-object, foreach-object, catch and switch.

Praca z plikami csv

Przykłady:

Najważniejsze informacje:

  1. Do pracy z plikami *.csv służą komendy Export-Csv oraz Import-Csv.
  2. Mając kolekcję informacji możemy wybrać tylko część danych, które chcemy zapisać lub odtworzyć używając do tego celu komendy Select-Object. Komenda pozwala wybierać konkretne właściwości przetwarzanego obiektu. Do wyświetlenia wszystkich dostępnych właściwości i metod danego obiektu służy komenda Get-Member.
  3. Domyślnym separatorem jest przecinek ‘,’.
Komunikacja z bazą danych

Przykłady:

Najważniejsze informacje:

  1. Do zapytań, które mogą być wykonane w jednej transakcji (najczęścięj pobieranie danych) można wykorzystać komendę Invoke-SqlCmd. Domyślnie komenda jest wywoływana w trybie Integrated Security. Komenda zwraca obiekt (kolekcję) wyników, który można np. zapisać do pliku csv.
  2. Do wykonywania zapytań w obrębie transakcji trzeba skorzystać z providera ADO.Net.
Tworzenie funkcji

Przykłady:

Najważniejsze informacje:

  1. Parametry wejściowe do funkcji możemy podawać tak samo jak parametry wejściowe do skryptu lub korzystając ze składni podobnej do tej w C#.
  2. Podawanie typów parametrów jest opcjonalne.
  3. Dla parametrów możemy podawać wartości domyślne.
  4. Do zwracania wartości nie ma żadnego słowa kluczowego, używamy po prostu wypisania wyniku na wyjście, tak, jak zostało to pokazane w przykładzie Match-Extension.
  5. Komenda Select-String służy do wyszukiwania tekstów w łańcuchach znaków i plikach wybiera tylko te elementy, które pasują do wzorca. Wzorcem może być tablica elementów lub wyrażenia regularne.
  6. Komenda Group (alias dla Group-Object) grupuje elementy w zbiorze wyjściowym, dzięki temu jesteśmy w stanie np. pobrać liczbę elementów w zbiorze.
Tworzenie archiwów *.zip

Źródło: http://itproctology.blogspot.com/2013/08/zip-files-and-folders-with-powershell.html

 Rozpakowanie archiwum *.zip

Źródło: http://www.howtogeek.com/tips/how-to-extract-zip-files-using-powershell/

Przydatne funkcje

Źródło: http://serverfault.com/questions/95431/in-a-powershell-script-how-can-i-check-if-im-running-with-administrator-privli

Wywoływanie skryptów i polityka wykonania

Przykład:

Najważniejsze informacje:

  1. Skrypty PowerShell mają rozszerzenie *.ps1.
  2. Wywołując skrypt możemy podać ścieżkę względną lub bezwzględną. W przypadku ścieżki względnej ciąg musi się rozpoczynać od znaku kropki ‘.’.
  3. Wywoływanie zewnętrznych skryptów jest kontrolowane przez politykę wykonania (ExecutionPolicy). Domyślnie Microsoft wyłączył możliwość wykonywania skryptów niewiadomego pochodzenia w celu zwiększenia bezpieczeństwa. Tryb możemy zmienić korzystając z komendy Set-ExecutionPolicy i podając poziom zabezpieczeń jako parametr. Do wyboru są 4 poziomy zabezpieczeń:
    Tryb Opis
    Restricted Zewnętrze skrypty nie mogą być uruchamiane.
    AllSigned Tylko skrypty podpisane przez zaufanych dostawców mogą być uruchamiane.
    RemoteSigned Pobrane skrypty muszą być podpisane przez zaufanego dostawcę przed uruchomieniem.
    Unrestricted Najniższy poziom zabezpieczeń. Wszystkie skrypty mogą być wykonywane.
Dodatkowe Informacje
  1. PowerShell MSDN manual
  2. Scripting with Windows PowerShell
  3. Windows PowerShell Basics
  4. Basic Windows PowerShell commands you should already know
  5. Conditional Logic (if, elseif, else and switch)
  6. Windows PowerShell $_. variable
  7. PowerShell Data Types
  8. PowerShell Tutorial 9: Getting Loopy (conditional logic using loops)
  9. PowerShell: Working With Regular Expressions (regex)
  10. PowerShell Tutorial – Try Catch Finally and error handling in PowerShell
Podsumowanie

Pomimo tego, że temat PowerShella nie został wyczerpany wydaje mi się, że zebrane przeze mnie informacje są wystarczające żeby rozwiązać większość napotkanych problemów podczas pisania własnych skryptów. Korzystając z zawartych tutaj notatek udało mi się z powodzeniem napisać skrypt administracyjny (+/- 500 linii kodu) nie mając wcześniej styczności z PowerShellem.

2 comments on “PowerShell – mini kompendium
  1. Witam.
    Czy jest możliwość napisania skryptu w którym będą nw. informacje:

    1. Nazwa komputera.
    2. S/N komputera.
    3. Rodzaj Systemu Windows (Win 7, Win 10, itp.).
    4. Rodzaj używanego oprogramowania Microsoft Office (2007, 2010, 2013, itp.).
    5. Dyski twarde: s/n, nazwa i pojemność każdego z osobna (będącego w komputerze).
    6. Nazwa programu antywirusowego z nr aktualnej wersji.
    7. Dodatkowe oprogramowania nie wchodzące w skład systemu operacyjnego a które są zainstalowane na komputerze.
    8. Lista urządzeń obecnie podłączonych pod komputer.
    9. Lista użytkowników, którzy mają założone konto na przedmiotowym komputerze.
    10. Lista urządzeń które były podłączane pod USB do komputera.

    Informuję, że jestem laikiem w tym zakresie a nie ukrywam, że w pracy są potrzebne mi takie dane, podczas kontroli.

    Z poważaniem
    Sebastian (bastian77)

    • Witam, tak, jest możliwość napisana takiego skryptu. Wszystkie te informacje da się odczytać z systemu. Mały problem może być jedynie z klasyfikacją oprogramowania – które jest częścią systemu, a które nie. Nie jestem pewien, czy taką informację da się wyciągnąć z systemu czy trzeba to grupować ręcznie. Wtedy przygotowanie takiego grupowania może być czasochłonne i nie do końca prawidłowe (ze względu na różne wersje systemów operacyjnych).

Say something

Your email address will not be published. Required fields are marked with a grey bar.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">