Windows Powershell to nic innego jak interpreter poleceń opracowany przez firmę Microsoft. Jest następcą windowsowego command line'a (cmd), choć ja bym go nazwał bardziej rozbudowaną alternatywą lub rozszerzeniem dla command line'a, gdyż cmd nie został wyparty przez powershell'a. Powershell jest mocno zintegrowany z .NET Framework, jeżeli nie macie w systemie .NET Framework'a, to nie nacieszycie się zbytnio powershellem, a przynajmniej nie jego w miarę aktualną wersją. A skoro mowa o wersjach, to mamy dostęp do wersji z zakresu 1.0 do 5.0 (przynajmniej na chwilę pisania artykułu). Każda kolejna wersja tego narzędzia jest bogatsza o nowe funkcjonalności, co za tym idzie, nie wszystkie skrypty działające na nowszych wersjach PS'a będą działały również na starszych.
Powershell operuje na cmdlet'ach. Czym są cmdlet'y? Można powiedzieć, że są to niewidoczne skrypty kryjące się pod pojedyńczymi komendami, oferujące pewien zakres funkcjonalności. Do dyspozycji mamy szereg wbudowanych w interpreter cmdlet'ów, mamy także możliwość napisania własnych. To między innymi w nich własnie zachodzi ścisła współpraca pomiędzy naszym interpreterem poleceń, a .NET Framework'iem. W dużym uproszczeniu korzystając z cmdlet'u w powershell'u wywołujemy jakąś funkcjonalność która zwraca nam obiekty .NET Framework'a. Przykładowo wpisując w powershell'u polecenie (cmdlet) Get-Process dostaniemy listę procesów w systemie.
PS C:\Windows\system32> Get-Process
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
170 11 6004 10736 ...96 0.38 3236 audiodg
119 10 4168 13176 ...62 11.86 2896 conhost
296 14 1236 3816 ...98 384 csrss
221 17 1288 4576 ...95 460 csrss
256 17 3668 11440 ...59 2172 dllhost
227 15 3700 10820 ...08 2292 dllhost
145 9 1632 7492 ...36 0.03 4284 dllhost
239 23 69716 85988 ...44 884 dwm
1758 81 27240 87348 ...14 81.28 1332 explorer
0 0 0 4 0 0 Idle
200 14 2660 13544 ...31 1.14 3988 InstallAgent
979 23 4700 12848 ...98 588 lsass
161 11 2148 7896 ...89 1820 MpCmdRun
186 14 2620 7848 ...97 2416 msdtc
667 67 104224 64800 ...91 1488 MsMpEng
...
Listę większości komend w powershell'u możemy dostać poprzez wywołanie komendy Get-Command. Dodatkowo możemy przefiltrować je ze względu na cmdlet'y wydając komendę z parametrem Type.
PS C:\Windows\system32> Get-Command -Type Cmdlet CommandType Name Version Source ----------- ---- ------- ------ Cmdlet Add-AppxPackage 2.0.0.0 Appx Cmdlet Add-AppxProvisionedPackage 3.0 Dism Cmdlet Add-AppxVolume 2.0.0.0 Appx Cmdlet Add-BitsFile 2.0.0.0 BitsTransfer Cmdlet Add-CertificateEnrollmentPolicyServer 1.0.0.0 PKI Cmdlet Add-Computer 3.1.0.0 Microsoft.PowerShell.Management Cmdlet Add-Content 3.1.0.0 Microsoft.PowerShell.Management Cmdlet Add-History 3.0.0.0 Microsoft.PowerShell.Core Cmdlet Add-JobTrigger 1.1.0.0 PSScheduledJob Cmdlet Add-KdsRootKey 1.0.0.0 Kds Cmdlet Add-Member 3.1.0.0 Microsoft.PowerShell.Utility Cmdlet Add-PSSnapin 3.0.0.0 Microsoft.PowerShell.Core Cmdlet Add-Type 3.1.0.0 Microsoft.PowerShell.Utility Cmdlet Add-WindowsCapability 3.0 Dism Cmdlet Add-WindowsDriver 3.0 Dism ...
Lista dostępnych komend zależy od wersji powershell'a. Zazwyczaj z każdą kolejną wersją rozszerzano listę dostępnych funkcji. Kolumn z informacjami na temat komend może być znacznie więcej. Przykład możecie zobaczyć na poniższym obrazku. Pierwsza kolumna pokazuje nam nazwy kolumn z informacjami na temat danej komendy.
Na temat każdego cmdlet'a możemy wywołać okno pomocy, coś ala linuxowy manual. Aby to zrobić wykonujemy polecenie Get-help z nazwą cmd-let'a lub innego typu polecenia.
Co do wersji samego powershell'a to możemy ją sprawdzić wydając komendę $PSVersionTable
PS C:\Windows\system32> $PSVersionTable
Name Value
---- -----
PSVersion 5.0.10240.16384
WSManStackVersion 3.0
SerializationVersion 1.1.0.1
CLRVersion 4.0.30319.42000
BuildVersion 10.0.10240.16384
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
PSRemotingProtocolVersion 2.3