Windows PowerShell

Z Wikipedii, wolnej encyklopedii
Skocz do: nawigacja, szukaj
Windows PowerShell
interpreter poleceń
Zrzut ekranu Windows PowerShell 1.0
Zrzut ekranu Windows PowerShell 1.0
Autor Microsoft
System operacyjny Windows XP lub nowszy
Pierwsze wydanie 14 listopada 2006
Aktualna wersja stabilna 5.0 / 29 lipca 2015; rok temu
Licencja Zamknięte oprogramowanie
Strona internetowa

Windows PowerShell (poprzednio Microsoft Shell lub MSH, nazwa kodowa Monad) to interpreter poleceń opracowany przez firmę Microsoft. Jest znacznie bardziej rozbudowany w stosunku do wcześniejszych interpreterów COMMAND.COM i cmd.exe, stosowanych w systemach operacyjnych MS-DOS i Microsoft Windows. PowerShell został wydany w 2006 roku i jest dostępny dla Windows XP SP2, Windows Server 2003 i nowszych. Jest wbudowany w Microsoft Windows Server 2008 i Microsoft Windows Server 2012 jako cecha opcjonalna (nie instalowana automatycznie).

PowerShell jest zintegrowany z .NET Framework i dostarcza środowisko do wykonywania zadań administracyjnych wykonywanych poleceniami cmdlets.

Od 2008 roku, common criteria (lista warunków, które muszą zostać spełnione) dla wszystkich produktów serwerowych Microsoft zawiera zarządzanie przez PowerShell. Oznacza to, że przy pomocy interpretera poleceń wykonać można każde działanie administracyjne na każdym współczesnym produkcie. Dzięki temu znacząco ujednolica i upraszcza się skryptowe zarządzanie środowiskiem.

Charakterystyczną cechą PowerShell, odróżniającą go od innych interpreterów poleceń, jest logika obiektowa. Wynikiem każdego polecenia nie jest ciąg znaków na ekranie, ale obiekt określonego typu. W przypadku braku wskazania, co z danym obiektem należy zrobić, część jego właściwości wyświetlana jest na ekranie. Możliwe jest jednak bardziej zaawansowane wykorzystanie metod i właściwości zwróconego obiektu. Przykładowo polecenie Get-ChildItem (lub jego alias dir albo ls) zwraca listę plików i katalogów w bieżącej lokalizacji. Z otrzymanej przez Get-ChildItem | Get-Member listy, widać jednak, że można łatwo zastosować metodę Delete, bądź sięgnąć do właściwości LastAccessTime czy Attributes.

Praktycznie każda funkcja dostępna przez API systemu (czyli de facto każda operacja, którą w systemie Windows można zrobić) jest możliwa do wywołania z PowerShell. Oznacza to, że nie ma takiej opcji związanej z zarządzaniem systemem, której nie dałoby się wykonać poprzez skrypt PowerShell.

Projekt[edytuj]

Cmdlety[edytuj]

Cmdlety są specjalnymi komendami w środowisku PowerShell, które implementują konkretne funkcje. Są one rodzimymi komendami w stosie PowerShell. Ich nazwy są tworzone na zasadzie Czasownik-Rzeczownik, np. Get-ChildItem, przez co ich nazwa jednocześnie opisuje działanie komend.[1] Cmdlety zwracają rezultaty w postaci obiektów lub ich zbiorów (także w postaci tablic) i mogą opcjonalnie odbierać dane wejściowe w tej formie, czyniąc je odpowiednimi do użycia w roli "odbiorców" w potoku. Gdy jednak PowerShell zezwala na zapisywanie w potoku tablic i innych zbiorów obiektów, cmdlety zawsze przetwarzają obiekty indywidualnie. W przypadku zbiorów obiektów, PowerShell kolejno wywołuje cmdlet'a na każdym obiekcie ze zbioru.[1]

Cmdlety są wyspecjalizowanymi klasami .NET, których instancje są tworzone i wywoływane przez runtime PowerShell'a w trackie działania środowiska. Cmdlety wywodzą się zCmdlet lub z PSCmdlet; PSCmdlet była używana gdy zachodziła konieczność interakcji cmdleta z runtime PowerShell'a.[1] Te klasy bazowe definiowały konkretne metody - BeginProcessing(), ProcessRecord() oraz EndProcessing() – które były przeciążane przez implementację cmdlet'a w celu zapewnienia funkcjonalności. Gdy tylko cmdlet był uruchamiany, PowerShell kolejno wywoływał te metody, a ProcessRecord() była wywoływana gdy otrzymała dane wejściowe potoku.[2] Jeśli wysłano kolekcję obiektów, metoda jest wywoływana osobno dla każdego z nich. Klasa implementująca Cmdlet'a musi mieć jeden atrybut .NET - CmdletAttribute – określa on czasownik i rzeczownik, które tworzą nazwę cmdleta. Wspólne czasowniki są numerowane.>[3][4]

Jeśli cmdlet otrzyma dane wejściowe z potoku lub z parametru wiersza poleceń, w klasie musi być odpowiednia właściwość, wraz z zaimplementowanym mutatorem. PowerShell wywołuje mutatora poprzez wartość parametru lub przez dane wejściowe potoku, które mutator zapisuje jako zmienne w klasie. Następnie do tych wartości odnoszą się metody, które implementują tą funkcjonalność. Właściwości które mapują się do parametrów wiersza poleceń są oznaczone przez ParameterAttribute[5] i zdefiniowane, zanim nastąpi odwołanie do metodyBeginProcessing(). Te które odnoszą się do danych wejściowych potoku są również określone przez ParameterAttribute, ale mają zdefiniowany parametrValueFromPipeline.[6]

Implementacja takich klas cmdletów może odwołać się do dowolnego API w .NET i może być napisana w dowolnym języku .NET. Dodatkowo, PowerShell udostępnia konkretne interfejsy, takie jak WriteObject(), używany do korzystania ze specyficznych funkcjonalności PowerShell, jak np. zapisywanie obiektów wynikowych do potoku. Cmdlety mogą uzyskać bezpośredni dostęp do danych .NET lub za pomocą infrastruktrury Dostawców PowerShell'a, dzięki którym zbiory danych są adresowalne przy użyciu unikalnych ścieżek. Te zbiory są oznaczone literami dysków (oraz zaadresowane jako katalogi.) Usługodawcy PowerShell'a zapewniają dostęp do m.in. systemu plików, rejestru, zbioru certyfikatów, a także do przestrzeni nazw dla aliasów komend, zmiennych i funkcji.[7] PowerShell zawiera także różnorodne cmdlety do zarządzania poszczególnymi systemami Windows, a także systemami plików. Ponadto mogą one wykorzystać narzędzie WMI do kontroli komponentów systemu Windows. Inne aplikacje mogą rejestrować cmdlety za pośrednictwem PowerShell'a, tym samym pozwalając środowisku na zarządzanie nimi.

PowerShell V2 zawiera nieco bardziej "przenośną wersję" Cmdletów, które są nazywane modułami. PowerShell V2 wydał następujące oświadczenie:

"Moduły pozwalają programistom i administratorom skryptów na podział i organizację swojego kodu w PowerShell w samodzielne segmenty wielokrotnego użytku. Kod z segmentu wykonuje we własnym autonomicznym kontekście i nie wywiera wpływu na obiekty poza nim. Moduły pozwalają także definiować ograniczone środowisko za pomocą skryptu."[8]

Potoki[edytuj]

Podobnie jak w systemie Linux, cmdlety PowerShell można ze sobą łączyć za pomocą potoków (ang. pipeline). Łączenie polega na tym, że dane wyjściowe jednego polecenia są uwzględnione, lub będą działać jako wejście do innego polecenia. Przykładowo, rezultat polecenia Get-Process można doprowadzić za pomocą potoku do Where-Object w celu odfiltrowania każdego procesu który ma poniżej 10 MB Pamięci stronicowanej, a następnie do komendy Sort-Object (by np. sortować obiekty na podstawie ilości operacji), i ostatecznie do komendy Select-Object w celu wybrania pierwszych 10-ciu procesów.[9]

Analogicznie jak w przypadku potoków Uniksowych, potoki PowerShell pozwalają na tworzenie złożonych komend, której poszczególne etapy są łączone za pomocą operatora |. Różnica między potokami z obu środowisk polega na tym, że etapy komendy są wykonywane w ramach PowerShell'a, a nie jako zbiór procesów koordynowany przez system operacyjny, ponadto pomiędzy etapami przekazywane są obiekty .NET zamiast strumienia bajtów. Dzięki korzystaniu z obiektów i wykonywaniu etapów w ramach PowerShell'a nie ma potrzeby Serializacji struktur danych, ani wyodrębniania ich przez bezpośrednie parsowanie tekstu wyjściowego. Obiekt może także enkapsulować konkretne funkcje działające na zawartych w nim danych, do których dostęp będzie miała docelowa komenda.[10][11] W przypadku ostatniego cmdlet'a w potoku, PowerShell automatycznie łączy jego obiekty wyjściowe do cmdlet'a Out-Default, który przekształca obiekty w strumień sformatowanych obiektów, a następnie wyświetla je na ekranie.[12][13]

Ponieważ wszystkie obiekty PowerShell'a są obiektami typu .NET, współdzielą między sobą metodę .ToString(), która zwraca dane z obiektu w formie tekstowej. Dodatkowo, PowerShell pozwala na zdefiniowanie sposobu formatowania: tekstowa reprezentacja obiektów może być skonfigurowana poprzez wybranie, jaki typ danych będzie wyświetlony i w jaki sposób to nastąpi. Jednak w celu zachowania kompatybilności wstecznej, jeśli dojdzie do sytuacji w której zewnętrzny Plik wykonywalny zostanie użyty w potoku, otrzyma on strumień tekstu reprezentujący obiekt, zamiast bezpośrednio zintegrować się z systemem typu PowerShell.[14][15][16]

Pożądany stan konfiguracji[edytuj]

Pożądany stan konfiguracji (z ang. Desired State Configuration - DSC) pozwala na deklaratywne określenie sposobu, w jaki ma zostać skonfigurowane środowisko oprogramowania.[17]

Po uruchomieniu "konfiguracji", DSC sprawdza, czy stan systemu jest zgodny ze stanem opisanym w konfiguracji. Konfiguracje DSC są idempotentne. Tzw. "Lokalny menedżer konfiguracji" (ang. Local Configuration Manager - LCM) okresowo wysyła zapytania do systemu za pomocą przepływu sterowania opisanegy przez "zasoby" (nadrzędne kawałki DSC), aby upewnić się, że stan konfiguracji jest zachowany.

Cmdlets a inne komendy[edytuj]

Poniższa tabela zawiera wybór z ponad 129 poleceń Cmdlets dostarczanych z PowerShell w porównaniu do odpowiadających im komend z konkurencyjnych interpreterów komend. Każde polecenie składa się z dwóch części: czasownikowej (get, set, clear itp.) oraz rzeczownikowej (location, host, process itp.). Dzięki temu nauczenie się dwóch stosunkowo niedługich list słów kluczowych pozwala na praktyczne użycie ponad stu dostępnych poleceń. Polecenia dotyczące zwykle plików i katalogów mają znacznie szersze działanie i dotyczą obiektów w dowolnej przestrzeni nazw. Przykładowo mogą dotyczyć równie dobrze plików jak i gałęzi w rejestrze.

Windows PowerShell
(Cmdlet)
Windows PowerShell
(Alias)
cmd.exe / COMMAND.COM
(MS-DOS, Windows, OS/2, etc.)
Bash
(Unix, BSD, GNU/Linux, etc.)
Opis
Set-Location sl, cd, chdir cd, chdir cd Zmienia aktualną lokalizację (katalog, gałąź rejestru, repozytorium certyfikatów)
Clear-Host cls, clear cls clear Czyści ekran
Copy-Item cpi, copy, cp copy cp Kopiuje obiekty (np. pliki) lub fragment struktury (np. drzewo katalogów)
Get-Help help, man help man Wyświetla pomoc do komend
Get-Command gcm help type, which, compgen Wyświetla listęp dostępnych komend
Get-Location gl, cd, pwd cd pwd Wyświetla ścieżkę do obecnego katalogu
Move-Item mi, move, mv move mv Przenosi plik/katalog do nowej lokalizacji
Remove-Item ri, del, rmdir, rd, rm del, rmdir, rd rm, rmdir Usuwa obiekt (plik, katalog itp.)
Rename-Item rni, ren ren mv Zmienia nazwę obiektu (pliku, katalogu itp.)
Get-ChildItem gci, dir, ls dir ls Zwraca wszystkie obiekty w bieżącej lokalizacji. (Na przykład pliki w aktualnym katalogu)
Write-Output echo, write echo echo Wyświetla łańcuchy, zmienne itd na ekranie
Pop-Location popd popd popd Zamienia aktualną lokalizację na lokalizację ostatnio przesuniętą na stos
Push-Location pushd pushd pushd Przesuwa aktualną lokalizację na stos
Set-Variable sv, set set set Wyświetla wartość zmiennej/Tworzy zmienną
Get-Content gc, type, cat type cat Wyświetla zawartość obiektu (np. pliku)
Get-Process gps, ps tlist, tasklist ps Wypisuje aktualnie uruchomione procesy
Stop-Process spps, kill kill, taskkill kill Zatrzymuje uruchomiony proces
Select-String sls find, findstr grep Wyświetla dane, które są zgodne z podanym ciagiem znaków
Tee-Object tee ? tee Tuneluje wejście do pliku lub zmiennej, przenosi wejście wzdłuż tunelu
Test-Connection N/A ping ping Wysyła zapytanie ping (ICMP Echo Request) z komputera użytkownika do konkretnego urządzenia, bądź też wydaje polecenie innemu urządzeniu aby wykonął tą operację
Invoke-WebRequest iwr, curl, wget N/A wget, curl Pobiera zawartość strony internetowej

Przykłady[edytuj]

Jedne z najbardziej przydatnych:

  • Zatrzymuje wszystkie procesy, których nazwa zaczyna się na literę "c":
 PS> get-process c* | stop-process
  • Szuka procesu, który zużywa więcej niż 300 MB i zatrzymuje go (ang. kill):
 PS> get-process | where-object { $_.WS -gt 300MB } | stop-process
  • Listuje wszystkie uruchomione usługi:
 PS> get-service | where-object { $_.Status -eq "Running" } | format-table name, displayname
  • Znajduje i usuwa wszystkie pliki z rozszerzeniem XYZ folderu "C:\test" i jego podfolderów:
 PS> get-childitem C:\test\* -include *.xyz -recurse | remove-item
  • Listuje wszystkie zdefiniowane aliasy:
 PS> get-alias
  • Listuje wszystkie polecenia (cmdlety, aplikacje lub aliasy) zaczynające się ciągiem znaków "new":
 PS> get-command new*
  • Wyświetla pomoc dla polecenia get-command:
 PS> get-help get-command

Rozszerzenia plików[edytuj]

  • PS1 – skrypty powłoki (ang. shell) Windows PowerShell.
Uwaga! Domyślne ustawienia PowerShell nie pozwalają na uruchamianie skryptów niepodpisanych cyfrowo. Ustawienie to można zmienić poleceniem Set-ExecutionPolicy (patrz: get-help about_signing).
  • PS1XML – typ i struktura danych Windows PowerShell.
  • PSC1 – plik konsoli Windows PowerShell.

Wsparcie dla aplikacji[edytuj]

Aplikacja Wersja Cmdlets Usługodawca Zarządzane poprzez GUI
Exchange Server 2007 402 Tak Tak
Windows Server 2008 Tak Tak Nie
Microsoft SQL Server 2008 Tak Tak Nie
Microsoft SharePoint 2010 Tak Tak Nie
System Center Configuration Manager 2012 R2 400+ Tak Nie
System Center Operations Manager 2007 74 Tak Nie
System Center Virtual Machine Manager 2007 Tak Tak Tak
System Center Data Protection Manager 2007 Tak Nie Nie
Windows Compute Cluster Server 2007 Tak Tak Nie
Microsoft Transporter Suite dla Lotus Domino[18] 08.02.0012 47 Nie Nie
Microsoft PowerTools dla Open XML[19] 1.0 33 Nie Nie
IBM WebSphere MQ[20] 6.0.2.2 44 Nie Nie
Quest Management Shell for Active Directory[21] 1.6 95 Nie Nie
Special Operations Software Specops Command[22] 1.0 Tak Nie Tak
VMware vSphere PowerCLI[23] 6.3 R1 455 Tak Tak
Internet Information Services[24] 7.0 54 Tak Nie
Windows 7 Troubleshooting Center[25] 6.1 Tak Nie Tak
Microsoft Deployment Toolkit[26] 2010 Tak Tak Tak
NetApp Data ONTAP PowerShell Toolkit[27][28] 4.1 1848 Tak Tak
JAMS Scheduler – Job Access & Management System[29] 5.0 52 Tak Tak
UIAutomation[30] 0.8 432 Nie Nie
Dell Equallogic[31] 3.5 55 Nie Nie
LOGINventory[32] 5.8 Tak Tak Tak
SePSX[33] 0.4.1 39 Nie Nie

Alternatywne implementacje[edytuj]

Projekt Pash (nazwa jest grą słów Uniksowej powłoki "bash"[34]) był otwartym oprogramowaniem i wieloplatformową reimplementacją PowerShell'a zrobioną za pomocą frameworka Mono. Pash został napisany w języku C# przez Igora Moochnick'a i wydany na licencji GNU. Rozwój tego projektu wstrzymano w roku 2008 i wznowiono w 2012.[34][35]


Przypisy

  1. a b c Windows PowerShell Cmdlets. [dostęp 5 sierpnia 2016].
  2. Creating Your first Cmdlet. [dostęp 5 sierpnia 2016].
  3. Get-Verb. Microsoft, 8 maj 2014.
  4. Cmdlet Overview. Microsoft, 8 maj 2014.
  5. Adding parameters That Process Command Line Input. [dostęp 5 sierpnia 2016].
  6. Adding parameters That Process Pipeline Input. [dostęp 5 sierpnia 2016].
  7. Windows PowerShell Providers. [dostęp 5 sierpnia 2016].
  8. Windows Management Framework (Windows PowerShell 2.0, WinRM 2.0, and BITS 4.0). 24 września 2014. [dostęp 5 sierpnia 2016].
  9. Grzegorz Gałęzowski: Kurs programowania w PowerShell cz.5. 08-10-2011.
  10. Don Jones: Windows PowerShell – Rethinking the Pipeline. W: Microsoft TechNet [on-line]. Microsoft, 2008. [dostęp 5 sierpnia 2016].
  11. Windows PowerShell Object Concepts. [dostęp 2007-11-28]. [zarchiwizowane z tego adresu (19 sierpnia 2007)].
  12. PowerShell Team: How PowerShell Formatting and Outputting REALLY works. [dostęp 5 sierpnia 2016].
  13. PowerShell Team: More – How does PowerShell formatting really work?. [dostęp 5 sierpnia 2016].
  14. about_Pipelines. W: TechNet [on-line]. Microsoft, 8 maja 2014.
  15. about_Objects. W: TechNet [on-line]. Microsoft, 8 maja 2014.
  16. about_Format.ps1xml. W: TechNet [on-line]. Microsoft, 8 maja 2014.
  17. E. Slesar: Windows PowerShell Desired State Configuration Overview.
  18. Microsoft Transporter Suite for Lotus Domino. [dostęp 5 sierpnia 2016].
  19. PowerTools for Open XML. [dostęp 5 sierpnia 2016].
  20. MO74: WebSphere MQ – Windows PowerShell Library. [dostęp 5 sierpnia 2016].
  21. PowerShell Commands for Active Directory by Quest Software. [dostęp 5 sierpnia 2016].
  22. PowerShell Remoting through Group Policy. [dostęp 5 sierpnia 2016].
  23. VMware vSphere PowerCLI. [dostęp 5 sierpnia 2016].
  24. Windows PowerShell : IIS7 PowerShell Provider Tech Preview 2. [dostęp 5 sierpnia 2016].
  25. Kudos to the Win7 Diagnostics Team. [dostęp 5 sierpnia 2016].
  26. Niehaus Michael: MDT 2010 New Feature #16: PowerShell support. 10 lipca 2009. [dostęp 5 sierpnia 2016].
  27. Kudos to NetApp for Data ONTAP PowerShell ToolKit. [dostęp 5 sierpnia 2016].
  28. PowerShell Toolkit 3.2 Announcement. [dostęp 5 sierpnia 2016].
  29. Heterogeneous Job Scheduling With PowerShell. [dostęp 5 sierpnia 2016].
  30. UIAutomation PowerShell Extensions. [dostęp 5 sierpnia 2016].
  31. EqualLogic HIT-ME with PowerShell. [dostęp 5 sierpnia 2016].
  32. Loginventory 5.8 mit besserer Erfassung und Zugriffssteuerung. [dostęp 5 sierpnia 2016].
  33. Selenium PowerShell eXtensions. [dostęp 5 sierpnia 2016].
  34. a b Pash. W: SourceForge [on-line]. Dice Holdings, Inc.. [dostęp 4 sierpnia 2016].
  35. Pash Project. [dostęp 4 sierpnia 2016].

Linki zewnętrzne[edytuj]