Loading AI tools
język programowania Z Wikipedii, wolnej encyklopedii
PowerShell (poprzednio Windows PowerShell, Microsoft Shell lub MSH, nazwa kodowa Monad) – interpreter poleceń opracowany przez firmę Microsoft. Początkowo był to składnik systemu Windows, znany jako Windows PowerShell. Wraz z wprowadzeniem PowerShell Core jest to oprogramowanie wieloplatformowe oraz open-source[1][2][3].
Logo programu | |
Zrzut ekranu Windows PowerShell 7.1.5 w Windows Terminal | |
Autor | Microsoft |
---|---|
Pierwsze wydanie | 14 listopada 2006 |
Aktualna wersja stabilna | 7.4.6 (22 października 2024) [±] |
Platforma sprzętowa | x86, x64, ARM |
System operacyjny | Windows: 10, 11, Server 2016, Server 2019, Server 2022; Linux, Mac OS X |
Rodzaj | interpreter poleceń |
Licencja | MIT |
Strona internetowa |
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 oraz Linux i OS X. 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
listy, widać jednak, że można łatwo zastosować metodę Get-ChildItem | Get-Member
Delete
, bądź sięgnąć do właściwości LastAccessTime
czy Attributes
.
Każda funkcja dostępna przez API systemu 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.
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[4]. 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 cmdleta na każdym obiekcie ze zbioru[4].
Cmdlety są wyspecjalizowanymi klasami .NET, których instancje są tworzone i wywoływane przez runtime PowerShella w trakcie działania środowiska. Cmdlety wywodzą się zCmdlet
lub z PSCmdlet
; PSCmdlet była używana, gdy zachodziła konieczność interakcji cmdleta z runtime PowerShella[4]. Te klasy bazowe definiowały konkretne metody - BeginProcessing()
, ProcessRecord()
oraz EndProcessing()
– które były przeciążane przez implementację cmdleta 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[5]. Jeśli wysłano kolekcję obiektów, metoda jest wywoływana osobno dla każdego z nich. Klasa implementująca Cmdleta musi mieć jeden atrybut .NET - CmdletAttribute
– określa on czasownik i rzeczownik, które tworzą nazwę cmdleta. Wspólne czasowniki są numerowane.[6][7]
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
[8] 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
[9].
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 PowerShella, 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 PowerShella 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[10]. 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 PowerShella, 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.”[11]
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
można doprowadzić za pomocą potoku do Get-Process
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 Where-Object
w celu wybrania pierwszych 10 procesów[12].Select-Object
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 PowerShella, 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 PowerShella 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[13][14]. W przypadku ostatniego cmdleta w potoku, PowerShell automatycznie łączy jego obiekty wyjściowe do cmdleta Out-Default
, który przekształca obiekty w strumień sformatowanych obiektów, a następnie wyświetla je na ekranie[15][16].
Ponieważ wszystkie obiekty PowerShella 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[17][18][19].
Pożądany stan konfiguracji (z ang. Desired State Configuration - DSC) pozwala na deklaratywne określenie sposobu, w jaki ma zostać skonfigurowane środowisko oprogramowania[20].
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 opisanego przez „zasoby” (nadrzędne kawałki DSC), aby upewnić się, że stan konfiguracji jest zachowany.
Poniższa tabela zawiera polecenia Cmdlets
dostarczane z PowerShell porównane 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 |
Jedne z najbardziej przydatnych:
PS> Get-Process c* | Stop-Process
PS> Get-Process | Where-Object { $_.WS -gt 300MB } | Stop-Process
PS> Get-Service | Where-Object { $_.Status -eq "Running" } | Format-Table Name, DisplayName
PS> Get-ChildItem C:\test\* -Include *.xyz -Recurse | Remove-Item
PS> Get-Alias
PS> Get-Command new*
get-command
:PS> Get-Help Get-Command
Set-ExecutionPolicy
(patrz: get-help about_signing
).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[21] | 08.02.0012 | 47 | Nie | Nie |
Microsoft PowerTools dla Open XML[22] | 1.0 | 33 | Nie | Nie |
IBM WebSphere MQ[23] | 6.0.2.2 | 44 | Nie | Nie |
Quest Management Shell for Active Directory[24] | 1.6 | 95 | Nie | Nie |
Special Operations Software Specops Command[25] | 1.0 | Tak | Nie | Tak |
VMware vSphere PowerCLI[26] | 6.3 R1 | 455 | Tak | Tak |
Internet Information Services[27] | 7.0 | 54 | Tak | Nie |
Windows 7 Troubleshooting Center[28] | 6.1 | Tak | Nie | Tak |
Microsoft Deployment Toolkit[29] | 2010 | Tak | Tak | Tak |
NetApp Data ONTAP PowerShell Toolkit[30][31] | 4.1 | 1848 | Tak | Tak |
JAMS Scheduler – Job Access & Management System[32] | 5.0 | 52 | Tak | Tak |
UIAutomation[33] | 0.8 | 432 | Nie | Nie |
Dell Equallogic[34] | 3.5 | 55 | Nie | Nie |
LOGINventory[35] | 5.8 | Tak | Tak | Tak |
SePSX[36] | 0.4.1 | 39 | Nie | Nie |
Projekt Pash (nazwa jest grą słów Uniksowej powłoki „bash”[37]) był otwartym oprogramowaniem i wieloplatformową reimplementacją PowerShella zrobioną za pomocą frameworka Mono. Pash został napisany w języku C# przez Igora Moochnicka i wydany na licencji GNU. Rozwój tego projektu wstrzymano w roku 2008 i wznowiono w 2012.[37][38]
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.