Witaj w kolejnym wpisie z serii PowerShell podstawy. Dziś przyjrzymy się nieco dokładniej poleceniom PowerShella, czyli cmdletom. Pokażę Ci, jak taki cmdlet jest zbudowany, czego potrzebuje do działania oraz jak możesz zacząć korzystać z różnych poleceń bez zbędnych obaw. Zaczynajmy.
Czym jest Cmdlet?
Cmdlet to gotowa, wbudowana funkcja, która w przeciwieństwie do tradycyjnych komend z cmd.exe czy powłok Unixowych jest oparta na platformie .NET. Dzięki czemu zwraca dane w postaci obiektów, a nie zwykłego tekstu, co znacznie ułatwia manipulacje danymi. Wszystkie cmdlety zbudowane są według ściśle określonej konwencji nazewniczej. To właśnie dzięki temu PowerShell jest tak spójny i łatwy do nauki. I chociaż na pierwszy rzut oka komenda w PowerShellu, taka jak Get-Process
, może wyglądać tajemniczo, a nawet onieśmielająco. Jednak gdy poznasz jej strukturę, zobaczysz, że sama składnia jest w rzeczywistości logiczna, spójna i co najważniejsze przewidywalna.
Konwencja nazewnicza Verb-Noun
W zasadzie każdy cmdlet w PowerShellu ma formę czasownik-rzeczownik (verb-noun).
Poniżej podaję kilka przykładów:
Get-Process
Start-Service
New-Item
Czasownik (Verb)
Czasownik zazwyczaj opisuje jaką akcję chcesz wykonać. Microsoft utrzymuje listę zatwierdzonych czasowników, aby zachować spójność i umożliwić łatwiejsze odgadywanie nazw cmdletów, nawet jeśli nie pamiętasz ich dokładnie. Listę możesz wywołać wpisując polecenie Get-Verb. Poniżej zamieszczam najczęściej spotykane czasowniki z krótkim opisem:
Get
— pobierz informacje (tylko do odczytu)Set
— ustaw lub zmień wartośćNew
— utwórz coś nowegoRemove
— usuńStart
/Stop
— uruchom lub zatrzymaj usługę, proces albo zadanieTest
— sprawdź, czy warunek jest prawdziwy
Rzeczownik (Noun)
Rzeczownik z kolei opisuje jaki obiekt jest celem operacji. Zaczyna się wielką literą (przynajmniej tak mówią dobre praktyki) i zazwyczaj występuje w liczbie pojedynczej (np. Process
, Service
, Item
).
Get-Process
można więc odczytać jako „Pobierz informacje o procesie”.
New-Item
oznacza „Utwórz nowy element (np. plik lub katalog)”.
Czasami dla odróżnienia obiektów może zawierać stosowny przedrostek. Przykładowo właśnie AD dla domeny ActiveDirectory czy AZ w przypadku usług chmury publicznej.
Parametry, czyli większa kontrola
Prawdziwa elastyczność cmdletów ujawnia się dopiero wtedy, gdy zaczniesz używać parametrów. To one pozwalają określić, jak ma się zachować polecenie, lub wskazać konkretne obiekty.
Przykład:
PS C:\Users\Admin> Get-Process -Name Notepad
NPM(K) PM(M) WS(M) CPU(s) Id SI ProcessName
------ ----- ----- ------ -- -- -----------
45 57.92 119.78 3.03 2292 2 Notepad
To polecenie pobiera tylko procesy o nazwie notepad i wyświetla informacje o nich.
Zastanawiasz się pewnie, skąd wiadomo, jakie parametry są dostępne? To bardzo dobre pytanie, szczególnie, że każdy cmdlet ma nieco inny zestaw. Na szczęście PowerShell udostępnia coś takiego jak składnia polecenia, co bardzo ułatwia naukę.
Składnia w PowerShellu
Na przykładzie Get-EventLog
możemy się temu przyjrzeć nieco dokładniej.
PS C:\Users\Admin> (Get-Help Get-EventLog).syntax
Get-EventLog [-LogName] <System.String> [[-InstanceId] <System.Int64[]>] [-After <System.DateTime>]
[-AsBaseObject] [-Before <System.DateTime>] [-ComputerName <System.String[]>] [-EntryType {Error |
Information | FailureAudit | SuccessAudit | Warning}] [-Index <System.Int32[]>] [-Message
<System.String>] [-Newest <System.Int32>] [-Source <System.String[]>] [-UserName <System.String[]>]
[<CommonParameters>]
Get-EventLog [-AsString] [-ComputerName <System.String[]>] [-List] [<CommonParameters>]
Składnia pokazuje po pierwsze nazwę polecenia, a następnie listę wszystkich dostępnych parametrów. Parametry są pogrupowane w pewne zestawy nazwane setami (od angielskiego paramiter sets). Każdy zestaw zawiera konkretne parametry, które nie mogą być mieszane między zestawami. Jeżeli zatem wybierzesz jakiś parametr z danego zestawu to musisz ściśle trzymać się tej konkretnej ścieżki, w przeciwnym przypadku całe działanie zakończy się błędem. Oczywiście jak łatwo zauważyć niektóre parametry wchodzą w skład kilku zestawów np. ComputerName
.
Za parametrem zwykle występuje wartość tego parametru, która w większości przypadków może przyjmować tylko ściśle określony typ. Zatem przykładowo parametr [-LogName]
może przybierać jedynie typ System.String
czyli tekst. Natomiast parametr [-InstanceId]
tylko wartości liczbowe. Występują również tzw. parametry przełączniki, które nie przyjmują wartości. Działają na zasadzie włącz/wyłącz. Jeżeli dany parametr występuję opcja jest aktywna w przeciwnym przypadku nie. Przykładem takiego rozwiązania jest parametr [-AsString]
.
Parametry obowiązkowe
Przyglądając się składni możesz zaobserwować, że większość parametrów występuje w nawiasach kwadratowych [ ]
natomiast część nie. Na początku może się to wydać dziwne i skomplikowane i przyznam szczerze, że łatwo się w tym pogubić. Musisz jednak zapamiętać, że wszystko co występuje w nawiasach kwadratowych jest opcjonalne. Zatem weźmy za przykład parametr [-ComputerName]
, który wraz ze swoją wartością znajdują się w nawiasach kwadratowych. Zatem cały parametr jest opcjonalny, bez niego polecenie się wykona, oczywiście uzyskując nieco inny efekt. Zobaczmy jednak jak jest z parametrem [-LogName]
. W tym przypadku tylko nazwa parametru jest w nawiasach natomiast wartość nie. Co to oznacza? Oznacza to, że do prawidłowego działania polecenia wymagana jest wartość parametru, natomiast nazwa jest opcjonalna. Zobaczmy jak to wygląda w praktyce:
W pierwszej kolejności całość polecenia, zatem Get-EventLog
z parametrem Logname
i wartością Application
.
PS C:\Users\Admin> Get-EventLog -LogName Application
Index Time EntryType Source InstanceID Message
----- ---- --------- ------ ---------- -------
44283 Sept 10 18:25 Information Software Protection… 1073758208 Successfully scheduled Software Protection servic…
44282 Sept 10 18:25 Information Software Protection… 3221241866 Offline downlevel migration succeeded.
44281 Sept 10 18:23 Information SecurityCenter 15 Updated Windows Defender status successfully to S…
44280 Sept 10 18:23 Information SecurityCenter 15 Updated Windows Defender status successfully to S…
44279 Sept 10 18:18 Information igcc 0 Obsługa elementu PowerEvent przez usługę została …
44278 Sept 10 18:18 Information BrYNSvc 0 The description for Event ID '0' in Source 'BrYNS…
Jak widzisz parametr z pełną nazwą i wartością działa doskonale. Co jednak gdy podam tylko wartość parametru?
PS C:\Users\Admin> Get-EventLog Application
Index Time EntryType Source InstanceID Message
----- ---- --------- ------ ---------- -------
44283 Sept 10 18:25 Information Software Protection… 1073758208 Successfully scheduled Software Protection servic…
44282 Sept 10 18:25 Information Software Protection… 3221241866 Offline downlevel migration succeeded.
44281 Sept 10 18:23 Information SecurityCenter 15 Updated Windows Defender status successfully to S…
44280 Sept 10 18:23 Information SecurityCenter 15 Updated Windows Defender status successfully to S…
44279 Sept 10 18:18 Information igcc 0 Obsługa elementu PowerEvent przez usługę została …
44278 Sept 10 18:18 Information BrYNSvc 0 The description for Event ID '0' in Source 'BrYNS…
Okazuje się, że działa to identycznie. Czas zatem na kolejną próbę, tym razem z nazwą parametru ale bez wartości.
PS C:\Users\Admin> Get-EventLog -LogName
Get-EventLog: Missing an argument for parameter 'LogName'. Specify a parameter of type 'System.Object' and try again.
PowerShell wyświetla błąd, brak argumentu dla parametru. Zatem tak jak wynika ze składni sama nazwa parametru jest opcjonalna i spokojnie można ją pominąć. Zobaczmy jednak co się stanie gdy pominiemy wszystko.
PS C:\Users\Admin> Get-EventLog
cmdlet Get-EventLog at command pipeline position 1
Supply values for the following parameters:
LogName:
W tym wypadku konsola sama wyświetli monit i poprosi nas o wpisanie danego parametru. Jeżeli teraz nic nie wpiszemy wygenerowany zostanie błąd związany z brakiem nazwy parametru.
Get-EventLog: Cannot bind argument to parameter 'LogName' because it is an empty string.
Inne parametry
Kolejnym elementem są parametry, których wartości znajdują się w nawiasach klamrowych { }
, przykładowo [-EntryType {Error | Information | FailureAudit | SuccessAudit | Warning}]. Oznacza to, że parametr ten przyjmuje jedynie te wartości, które zostały wymienione. W przykładzie poniżej wykorzystam wartość Error
, czyli zwracam same błędy.
PS C:\Users\Admin> Get-EventLog -LogName Application -EntryType Error
Index Time EntryType Source InstanceID Message
----- ---- --------- ------ ---------- -------
45661 Sept 18 11:19 Error .NET Runtime 1022 .NET Runtime version 4.0.30319.0 - Wystąpił błąd …
45659 Sept 18 11:17 Error .NET Runtime 1022 .NET Runtime version 4.0.30319.0 - Wystąpił błąd …
45658 Sept 18 11:17 Error .NET Runtime 1022 .NET Runtime version 4.0.30319.0 - Wystąpił błąd …
45392 Sept 15 21:28 Error Microsoft-Windows-R… 10006 Application or service Microsoft Office SDX Help…
45071 Sept 14 21:15 Error Microsoft-Windows-R… 10006 Application or service Microsoft Office SDX Help…
45029 Sept 13 05:45 Error .NET Runtime 1022 .NET Runtime version 4.0.30319.0 - Wystąpił błąd …
45028 Sept 13 05:43 Error .NET Runtime 1022 .NET Runtime version 4.0.30319.0 - Wystąpił błąd …
45027 Sept 13 05:40 Error .NET Runtime 1022 .NET Runtime version 4.0.30319.0 - Wystąpił błąd …
45026 Sept 13 05:32 Error .NET Runtime 1022 .NET Runtime version 4.0.30319.0 - Wystąpił błąd …
Każda inna wartość zakończy polecenie błędem.
PS C:\Users\Admin> Get-EventLog -LogName Application -EntryType Message
Get-EventLog: Cannot validate argument on parameter 'EntryType'. The argument "Message" does not belong to the set "Error,Information,FailureAudit,SuccessAudit,Warning" specified by the ValidateSet attribute. Supply an argument that is in the set and then try the command again.
Ostatnim elementem, który sobie omówimy są parametry, które mogą przyjmować wiele wartości. Można je łatwo odróżnić gdyż na końcu zmiennej posiadają nawiasy kwadratowe, przykładem może być [-ComputerName <System.String[]>]. W tym przypadku możesz podawać kilka wartości oddzielonych przecinkami. Zobaczmy jak to wygląda.
Get-EventLog -LogName Application -EntryType Error
Kolejność
Warto wiedzieć, że składnia to nie tylko spis parametrów. Istotna jest również ich kolejność, szczególnie jeżeli pominiemy opcjonalne nazwy. Wyobraź sobie, że każdy parametr ma przyporządkowany numer. Jeżeli chcesz wykonać polecenie bez wpisywania nazw parametrów to warto znać te numery. Przykładowo chciałbym wyświetlić logi z dziennika Application z InstanceID 0 oraz 1. Mogę to zrobić w następujący sposób:
PS C:\Users\Admin> Get-EventLog Application 0,1
Index Time EntryType Source InstanceID Message
----- ---- --------- ------ ---------- -------
45678 Sept 18 11:42 Information igcc 0 Obsługa elementu PowerEvent przez usługę została …
45677 Sept 18 11:42 Information BrYNSvc 0 The description for Event ID '0' in Source BrYNS…
45633 Sept 18 10:17 Information igcc 0 Obsługa elementu PowerEvent przez usługę została …
45632 Sept 18 10:17 Information BrYNSvc 0 The description for Event ID '0' in Source BrYNS…
45631 Sept 18 10:17 Information igcc 0 Obsługa elementu PowerEvent przez usługę została …
45630 Sept 18 10:17 Information BrYNSvc 0 The description for Event ID '0' in Source 'BrYNS…
45596 Sept 18 09:37 Information edgeupdate 0 Service stopped.
Jak widzisz PowerShell sam dopasował sobie co i jak i zwrócił poprawne wyniki. Co jednak jeżeli zmienimy kolejność?
PS C:\Users\Admin> Get-EventLog 0,1 Application
Get-EventLog: Cannot bind parameter 'InstanceId'. Cannot convert value "Application" to type "System.Int64". Error: "Input string was not in a correct format."
Tym razem to już nie zadziała. PowerShellowi nie zgadzają się wartości parametrów z ich kolejnością. Jeżeli jednak dodam nazwy parametru InstanceId to już wszystko jest OK.
PS C:\Users\Admin> Get-EventLog -InstanceId 0,1 Application
Index Time EntryType Source InstanceID Message
----- ---- --------- ------ ---------- -------
45678 Sept 18 11:42 Information igcc 0 Obsługa elementu PowerEvent przez usługę została …
45677 Sept 18 11:42 Information BrYNSvc 0 The description for Event ID '0' in Source 'BrYNS…
45633 Sept 18 10:17 Information igcc 0 Obsługa elementu PowerEvent przez usługę została …
45632 Sept 18 10:17 Information BrYNSvc 0 The description for Event ID '0' in Source 'BrYNS…
45631 Sept 18 10:17 Information igcc 0 Obsługa elementu PowerEvent przez usługę została …
45630 Sept 18 10:17 Information BrYNSvc 0 The description for Event ID '0' in Source 'BrYNS…
45596 Sept 18 09:37 Information edgeupdate 0 Service stopped.
Parametry wspólne (Common Parameters)
Oprócz typowych parametrów, PowerShell posiada specjalny zestaw parametrów wspólnych tzw. Common Parameters, które występują w większości cmdletów.
Najważniejsze z nich:
Verbose
— pokazuje szczegółowe informacje o działaniu cmdletuErrorAction
— określa sposób obsługi błędów (np.SilentlyContinue
,Stop
)WhatIf
— symuluje działanie polecenia bez jego faktycznego wykonaniaConfirm
— wyświetla monit wymagający potwierdzenia konkretnego działania
Przykład:
PS C:\Users\Admin> Clear-RecycleBin -WhatIf
What if: Performing the operation "Clear-RecycleBin" on target "All of the contents of the Recycle Bin".
To polecenie pokaże, jaka operacja została by wykonana.
Jak uczyć się cmdletów
Skoro już wiesz, jak działa struktura cmdletów, pojawia się pytanie: jak znaleźć te, które są Ci potrzebne, i nauczyć się ich składni? Kolejne dobrze postawione pytanie i kolejny raz PowerShell ma na to własne rozwiązanie.
Get-Command
Get-Command
to jedno z najważniejszych narzędzi do eksplorowania PowerShell. Wykonanie samego polecenia wyświetla pełną listę wszystkich dostępnych poleceń w bieżącej sesji (cmdlety, funkcje, aliasy, programy zewnętrzne).
PS C:\Users\Admin> Get-Command
CommandType Name Version Source
----------- ---- ------- ------
Alias Add-AdlAnalyticsDataSource 1.0.3 Az.DataLakeAnalytics
Alias Add-AdlAnalyticsFirewallRule 1.0.3 Az.DataLakeAnalytics
Alias Add-AdlStoreFirewallRule 1.3.0 Az.DataLakeStore
Alias Add-AdlStoreItemContent 1.3.0 Az.DataLakeStore
Alias Add-AdlStoreTrustedIdProvider 1.3.0 Az.DataLakeStore
Alias Add-AdlStoreVirtualNetworkRule 1.3.0 Az.DataLakeStore
Alias Add-AppPackage 2.0.1.0 Appx
Sama lista jest dość długa, dlatego czasem warto zawęzić wyniki przykładowo do konkretnego czasownika:
PS C:\Users\Admin> Get-Command -Verb Uninstall
CommandType Name Version Source
----------- ---- ------- ------
Function Uninstall-Dtc 1.0.0.0 MsDtc
Function Uninstall-Module 2.2.5 PowerShellGet
Function Uninstall-Module 2.2.5 PowerShellGet
Function Uninstall-Module 1.0.0.1 PowerShellGet
Function Uninstall-Script 2.2.5 PowerShellGet
Function Uninstall-Script 2.2.5 PowerShellGet
Function Uninstall-Script 1.0.0.1 PowerShellGet
Cmdlet Uninstall-ADServiceAccount 1.0.1.0 ActiveDirectory
Cmdlet Uninstall-AzureRm 2.13.0 Az.Accounts
Cmdlet Uninstall-Language 1.0 LanguagePackManagement
Cmdlet Uninstall-Package 1.4.8.1 PackageManagement
Cmdlet Uninstall-ProvisioningPackage 3.0 Provisioning
Cmdlet Uninstall-PSResource 1.1.1 Microsoft.PowerShell.PSResourceGet
Cmdlet Uninstall-TrustedProvisioningCertificate 3.0 Provisioning
Cmdlet Uninstall-WindowsFeature 2.0.0.0 ServerManager
Powyższe polecenie pokaże wszystkie cmdlety rozpoczynające się od Uninstall
.
PS C:\Users\Admin> Get-Command -Noun Service
CommandType Name Version Source
----------- ---- ------- ------
Cmdlet Get-Service 7.0.0.0 Microsoft.PowerShell.Management
Cmdlet New-Service 7.0.0.0 Microsoft.PowerShell.Management
Cmdlet Remove-Service 7.0.0.0 Microsoft.PowerShell.Management
Cmdlet Restart-Service 7.0.0.0 Microsoft.PowerShell.Management
Cmdlet Resume-Service 7.0.0.0 Microsoft.PowerShell.Management
Cmdlet Set-Service 7.0.0.0 Microsoft.PowerShell.Management
Cmdlet Start-Service 7.0.0.0 Microsoft.PowerShell.Management
Cmdlet Stop-Service 7.0.0.0 Microsoft.PowerShell.Management
Cmdlet Suspend-Service 7.0.0.0 Microsoft.PowerShell.Management
Wyświetli wszystkie cmdlety, których operacje dotyczą Serwisów.
PS C:\Users\Admin> Get-Command -Module Microsoft.PowerShell.Management
CommandType Name Version Source
----------- ---- ------- ------
Cmdlet Add-Content 7.0.0.0 Microsoft.PowerShell.Management
Cmdlet Clear-Content 7.0.0.0 Microsoft.PowerShell.Management
Cmdlet Clear-Item 7.0.0.0 Microsoft.PowerShell.Management
Cmdlet Clear-ItemProperty 7.0.0.0 Microsoft.PowerShell.Management
Cmdlet Clear-RecycleBin 7.0.0.0 Microsoft.PowerShell.Management
Cmdlet Convert-Path 7.0.0.0 Microsoft.PowerShell.Management
Cmdlet Copy-Item 7.0.0.0 Microsoft.PowerShell.Management
Cmdlet Copy-ItemProperty 7.0.0.0 Microsoft.PowerShell.Management
Cmdlet Debug-Process 7.0.0.0 Microsoft.PowerShell.Management
Cmdlet Get-ChildItem 7.0.0.0 Microsoft.PowerShell.Management
W tym wypadku dostaniemy tylko te polecenia, które wchodzą w skład konkretnego modułu.
Find-Command
Kolejnym wartościowym poleceniem jest Find-Command
. Jest ono szczególnie przydatne w sytuacjach, gdy potrzebujesz odnaleźć cmdlety, które nie są dostępne w Twoim lokalnym środowisku. Na przykład, gdy poszukujesz poleceń umożliwiających obsługę usług w chmurze publicznej:
PS C:\Users\Admin> Find-Command -Repository PSGallery | Where-Object Name -like '*Azure*'
Name Version ModuleName Repository
---- ------- ---------- ----------
New-AzActionGroupAzureAppPushRecei… 6.0.3 Az.Monitor PSGallery
New-AzActionGroupAzureFunctionRece… 6.0.3 Az.Monitor PSGallery
New-AzEventGridAzureFunctionEventS… 2.2.0 Az.EventGrid PSGallery
New-AzWebAppAzureStoragePath 3.4.1 Az.Websites PSGallery
Get-AzSecurityConnectorAzureDevOps… 1.8.0 Az.Security PSGallery
Get-AzSecurityConnectorAzureDevOps… 1.8.0 Az.Security PSGallery
Get-AzSecurityConnectorAzureDevOps… 1.8.0 Az.Security PSGallery
Get-AzSecurityConnectorAzureDevOps… 1.8.0 Az.Security PSGallery
New-AzSecurityAzureDevOpsScopeEnvi… 1.8.0 Az.Security PSGallery
💡Warto wiedzieć
Do korzystania z Find-Command potrzebny jest moduł PowerShellGet i dostęp do Internetu.
Parametr
-Name
w Find-Command nie wspiera wzorców (wildcards). Oznacza to, że nie możesz użyć np.*User*
alboGet-*
. Ta funkcja została zaprojektowana w dość restrykcyjny sposób i szuka dokładnej nazwy polecenia, tak jak jest opublikowana w repozytorium. Dlatego, aby znaleźć jakiś wzór konieczne jest przefiltrowanie za pomocąWhere-Object
.
Get-Help
Nastepnym cmdletem wartym zapamiętania jest Get-Help
. Szczególnie przydatny, gdy znajdziesz już polecenie, którego chcesz się nauczyć. Wtedy użyj:
PS C:\Users\Admin> Get-Help Get-Process
NAME
Get-Process
SYNTAX
Get-Process [[-Name] <string[]>] [-Module] [-FileVersionInfo] [<CommonParameters>]
Get-Process [[-Name] <string[]>] -IncludeUserName [<CommonParameters>]
Get-Process -Id <int[]> [-Module] [-FileVersionInfo] [<CommonParameters>]
Get-Process -Id <int[]> -IncludeUserName [<CommonParameters>]
Get-Process -InputObject <Process[]> [-Module] [-FileVersionInfo] [<CommonParameters>]
Get-Process -InputObject <Process[]> -IncludeUserName [<CommonParameters>]
ALIASES
gps
ps
REMARKS
Get-Help cannot find the Help files for this cmdlet on this computer. It is displaying only partial help.
-- To download and install Help files for the module that includes this cmdlet, use Update-Help.
-- To view the Help topic for this cmdlet online, type: "Get-Help Get-Process -Online" or
go to https://go.microsoft.com/fwlink/?LinkID=2096814.
Możesz też wyświetlić bardziej szczegółowe informacje:
Full
— pełna dokumentacja.Examples
— przykłady użycia (najczęściej najszybsza metoda zrozumienia).Detailed
— coś pomiędzy wersją podstawową a pełną.Online
— otwiera najnowszą dokumentację w przeglądarce.
Aktualizacja plików pomocy
Domyślnie na nowym systemie pliki pomocy mogą być przestarzałe lub niedostępne. Możesz je zaktualizować:
Update-Help
💡Warto wiedzieć
W celu aktualizowania wszystkich dostępnych modułów warto w pierwszej kolejności uruchomić PowerShella z podniesionymi uprawnieniami (tryb Administrator), a nastepnie wykonać Update-Help.
Aliasy, przydatne, ale używaj z rozwagą
PowerShell dla większości cmdletów posiada aliasy, czyli krótkie odpowiedniki pełnych poleceń. Dzięki temu osoby przyzwyczajone do pracy w cmd.exe lub środowiskach Unix mogą szybciej odnaleźć się w nowym środowisku. Alias umożliwia korzystanie z dobrze znanych komend, jednocześnie dając dostęp do pełnej funkcjonalności PowerShell. Poniżej przykładowe aliasy:
ls
→Get-ChildItem
dir
→Get-ChildItem
cp
→Copy-Item
mv
→Move-Item
W pracy interaktywnej aliasy są bardzo wygodne i pozwalają na szybsze wykonywanie poleceń, jednak w skryptach warto ich unikać. Używanie pełnych nazw cmdletów sprawia, że kod staje się bardziej czytelny i zrozumiały, nawet dla osób mniej doświadczonych.
Potok (Pipeline) — współpraca cmdletów
Cmdlety w PowerShell zostały zaprojektowane z myślą o współpracy poprzez potok (|). Dzięki niemu wynik działania jednego polecenia może być automatycznie przekazany jako wejście do kolejnego. Pozwala to łączyć proste polecenia w bardziej złożone operacje, bez konieczności pisania rozbudowanych skryptów. Potok jest jedną z największych zalet PowerShell, z którą warto lepiej się zaprzyjaźnić. Przykład:
PS C:\Users\Admin> Get-Process | Where-Object {$_.CPU -gt 100}
NPM(K) PM(M) WS(M) CPU(s) Id SI ProcessName
------ ----- ----- ------ -- -- -----------
17 3.57 3.58 258.52 3160 1 Apoint
1258 568.34 587.61 26,858.06 6864 1 chrome
77 604.91 376.09 18,077.42 8572 1 chrome
58 279.18 241.08 120.78 10760 1 chrome
84 435.97 386.44 970.12 10988 1 chrome
Tutaj pobieramy wszystkie procesy i filtrujemy tylko te, które zużywają ponad 100 sekund CPU.
Podsumowanie
Cmdlety to serce PowerShell. Zrozumienie ich budowy (Verb-Noun + parametry) odblokowuje prawdziwą moc tej powłoki. Nie musisz od razu zapamiętywać setek poleceń. Wystarczy, że poznasz najpopularniejsze czasowniki i zaczniesz eksperymentować z Get-Help
czy Get-COmmand.
Praca domowa:
Przećwicz wyszukiwanie poleceń z cmdletem Get-Command zgodnie z przykładami z lekcji.
Wybierz kilka cmdletów (np. Get-Process
, Get-Service
, New-Item
, Remove-Item
) i poeksperymentuj z różnymi parametrami. Jeśli nie jesteś pewien, użyj -WhatIf
.
To wszystko na dziś!
Jeśli masz ciekawe spostrzeżenia lub doświadczenia w tym temacie – koniecznie podziel się nimi w komentarzach.
A jeśli moje materiały są dla Ciebie pomocne, możesz postawić mi wirtualną kawę.
Dzięki za wsparcie!


Adam Pietrzak
Trener IT | Autor szkoleń | Entuzjasta PowerShellaAdministrator systemów i sieci wsparcia działań wojskowych z ponad 10-letnim doświadczeniem. Praktyk w dziedzinie bezpieczeństwa systemu Windows, automatyzacji zadań (PowerShell) oraz rozwiązań chmurowych. Trener i twórca materiałów edukacyjnych (szkolenia, warsztaty, artykuły, podręczniki). Pasjonat dzielenia się wiedzą i wspierania początkujących administratorów IT. Prywatnie – amator aktywnego wypoczynku i rodzinnych podróży.