{"id":2166,"date":"2018-06-20T10:41:27","date_gmt":"2018-06-20T08:41:27","guid":{"rendered":"http:\/\/miroslaw.borodziuk.eu\/?p=2166"},"modified":"2018-08-09T11:13:33","modified_gmt":"2018-08-09T09:13:33","slug":"powershell-wprowadzenie","status":"publish","type":"post","link":"http:\/\/miro.borodziuk.eu\/index.php\/2018\/06\/20\/powershell-wprowadzenie\/","title":{"rendered":"Powershell wprowadzenie"},"content":{"rendered":"<p>Szybki kurs Powershella. Cz\u0119\u015b\u0107 materia\u0142u pochodzi z referatu Piotra Ablewskiego.<\/p>\n<p><!--more--><\/p>\n<p>PowerShell ma struktur\u0119 sk\u0142adni czasownik-reczownik:<\/p>\n<pre class=\"lang:ps decode:true\">PS&gt; Get-childitem\r\nPS&gt; Set-location c:\\\r\nPS&gt; Clear-host<\/pre>\n<p>Argumenty zawsze zaczynaj\u0105 si\u0119 od znaku \u0142\u0105cznika (minusa). Argumenty oddzielone s\u0105 przecinkiem np:<\/p>\n<pre class=\"lang:sh decode:true\">PS&gt; verb-noun -param arg, arg<\/pre>\n<p>Argumenty uruchomieniowe skryptu, kt\u00f3re podane zosta\u0142y w linii komend mo\u017cna przegl\u0105da\u0107 dzi\u0119ki zmiennej $args. $args jest tablic\u0105, w kt\u00f3rej znajduj\u0105 si\u0119 parametry. Tablica ta indeksowana jest od 0. Aby dosta\u0107 si\u0119 bezpo\u015brednio do ostatniego elementu tablicy, mo\u017cna wykorzysta\u0107 indeks -1.<\/p>\n<p>Wywo\u0142uj\u0105c skrypt:<\/p>\n<pre class=\"lang:sh decode:true \">PS&gt; skrypt.ps1 \u2013pierwszy \u2013drugi \u2013trzeci<\/pre>\n<p>Do parametr\u00f3w dosta\u0107 mo\u017cna si\u0119 w nast\u0119puj\u0105cy spos\u00f3b:<br \/>\n<code>- $args[0]<\/code> \u2013 pierwszy<br \/>\n<code>- $args[1]<\/code> \u2013 drugi<br \/>\n<code>- $args[2]<\/code> \u2013 trzeci<br \/>\n<code>- $args[-1]<\/code> \u2013 trzeci<\/p>\n<p>Trzy typy komend mo\u017cliwych do uruchomienia:<br \/>\n&#8211; natywne<br \/>\nnp. ifconfig<br \/>\n&#8211; aliasy<br \/>\nnp. cls, ls<br \/>\n&#8211; skrypty<br \/>\n&#8211; cmdlet (commandlety)<\/p>\n<p>Sk\u0142adnia pozycyjna<br \/>\n&#8211; parametry musz\u0105 by\u0107 umieszczane we w\u0142a\u015bciwej kolejno\u015bci.<\/p>\n<p>Mo\u017cliwa zwi\u0119z\u0142a forma komend. Skrypty lepiej jednak pisa\u0107 w pelnej<br \/>\nd\u0142ugiej sk\u0142adni ze wzgl\u0119du na \u0142atwiejsze debugowanie takich skypt\u00f3w.<br \/>\nnp.<\/p>\n<pre class=\"lang:sh decode:true\">PS&gt; Stop-process -&gt; spps<\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #3366ff;\">Wy\u015bwietlenie listy dost\u0119pnych alias\u00f3w<\/span><\/p>\n<pre class=\"lang:sh decode:true \">PS&gt; get-alias<\/pre>\n<p>np.<\/p>\n<pre class=\"lang:sh decode:true\">PS&gt; set-location .\/Public\r\nPS&gt; cd ..\/\r\nPS&gt; sl .\/Public<\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #3366ff;\">Pomoc<\/span><\/p>\n<pre class=\"lang:sh decode:true\">PS&gt; get-help\r\nPS&gt; help<\/pre>\n<p>np.<\/p>\n<pre class=\"lang:sh decode:true\">PS&gt; get-help get-process\r\nPS&gt; get-help *process\r\nPS&gt; get-help stop*<\/pre>\n<p>Aby zobaczy\u0107 przyk\u0142ady u\u017cycia danej komendy nale\u017cy wykorzysta\u0107 opcj\u0119 :<\/p>\n<pre class=\"lang:sh decode:true\">PS&gt; Get-Help Komenda \u2013Examples<\/pre>\n<p>Dodatkowo b\u0119dziemy mogli wtedy przejrze\u0107 opis komendy.<br \/>\nAby uzyska\u0107 szczeg\u00f3\u0142owy opis polecenia, zilustrowany przyk\u0142adami pomocna b\u0119dzie opcja \u2013Detailed:<\/p>\n<pre class=\"lang:sh decode:true\">PS&gt; Get-Help Komenda \u2013Detailed<\/pre>\n<p>Aby przejrze\u0107 pe\u0142n\u0105 dokumentacj\u0119 techniczn\u0105 zawieraj\u0105c\u0105 opis komendy, parametry z opisami i przyk\u0142ady zastosowania, nale\u017cy u\u017cy\u0107 opcji \u2013Full:<\/p>\n<pre class=\"lang:sh decode:true\">PS&gt; Get-Help Komenda \u2013Full<\/pre>\n<p>Je\u017celi \u017cadna z zaprezentowanych powy\u017cej opcji nie rozwia\u0142a naszych w\u0105tpliwo\u015bci i nie przekaza\u0142a informacji, kt\u00f3rej poszukiwali\u015bmy, zawsze mo\u017cemy poszuka\u0107 informacji na temat danego cmdlet\u2019a w<br \/>\nInternecie, prosto z poziomu PowerShell, wykorzystuj\u0105c opcj\u0119 \u2013Online:<\/p>\n<pre class=\"lang:sh decode:true\">PS&gt; Get-Help Komenda \u2013Online<\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #3366ff;\">GET-COMMAND<\/span><br \/>\nKolejn\u0105 wa\u017cn\u0105 dla pocz\u0105tkuj\u0105cych komend\u0105 b\u0119dzie cmdlet Get-Command. Pozwoli ona na znalezienie cmdlet\u2019a, kt\u00f3rego sk\u0142adni dok\u0142adnie nie pami\u0119tamy.<br \/>\nJednak w pierwszej kolejno\u015bci skupmy si\u0119 na samej komendzie Get-Command. Wywo\u0142anie:<\/p>\n<pre class=\"lang:sh decode:true\">PS&gt; Get-Command<\/pre>\n<p>Powoduje, \u017ce wy\u015bwietlona zostaje lista wszystkich cmdlet\u2019\u00f3w zainstalowanych na komputerze oraz ich alias\u00f3w, funkcji, filtr\u00f3w, skrypt\u00f3w i dost\u0119pnych aplikacji. Polecenie to daje wyniki dotycz\u0105ce wszystkich sesji. Je\u017celi chcemy ograniczy\u0107 si\u0119 do bie\u017c\u0105cej sesji przydatny oka\u017ce si\u0119 parametr -ListImported:<\/p>\n<pre class=\"lang:sh decode:true\">PS&gt; Get-Command \u2013ListImported<\/pre>\n<p>Je\u015bli wykonamy polecenie:<\/p>\n<pre class=\"lang:sh decode:true\">PS&gt; Get-Command *<\/pre>\n<p>Otrzymamy list\u0119 wszystkich typ\u00f3w komend, wliczaj\u0105c w to programy, kt\u00f3re nie s\u0105 integraln\u0105 cz\u0119\u015bci\u0105 PowerShell\u2019a, a zawarte s\u0105 w katalogach zapisanych w zmiennej systemowej $PATH. Mo\u017cna zada\u0107 sobie pytanie: jaka jest r\u00f3\u017cnica pomi\u0119dzy poleceniami Get-Help a Get-Command. W pierwszy przypadku, wynik jest brany z manuala do danego polecenia, a w przypadku drugim \u2013 prosto z kodu komendy. Jakie inne parametry mog\u0105 by\u0107 jeszcze przydatne? Oto ich lista z wyja\u015bnieniem u\u017cycia. Oczywi\u015bcie dok\u0142adny opis wszystkich opcji mo\u017cna uzyska\u0107 korzystaj\u0105c z pomocy PowerShell\u2019a, a wi\u0119c wywo\u0142uj\u0105c<br \/>\ncmdlet\u2019a Get-Help.<\/p>\n<p>Parametry charakterystyczne dla cmdlet\u2019a Get-Command:<\/p>\n<pre class=\"lang:sh decode:true \">PS&gt; GET-COMMAND \u2013ALL<\/pre>\n<p>Zwraca list\u0119 wszystkich komend, w\u0142\u0105czaj\u0105c w to komendy tego samego typu, kt\u00f3re maj\u0105 te same nazwy (s\u0105 w innych przestrzeniach nazw).<\/p>\n<pre class=\"lang:sh decode:true\">PS&gt; Get-Command \u2013ArgumENtList argument<\/pre>\n<p>Zwaca list\u0119 wszystkich komend, kt\u00f3re mo\u017cna wywo\u0142a\u0107 z podanym parametrem<\/p>\n<pre class=\"lang:sh decode:true \">Get-Command \u2013CommandType typ<\/pre>\n<p>Zwraca tylko te komendy, kt\u00f3re nale\u017c\u0105 do danego typu komend. Dost\u0119pne typy to:<br \/>\n<code>? Alias<\/code> \u2013 alias do polecenia w PowerShell\u2019u<br \/>\n<code>? All<\/code> \u2013 komendy wszystkich typ\u00f3w<br \/>\n<code>? Applications<\/code> \u2013 pliki, kt\u00f3re nie s\u0105 cz\u0119\u015bci\u0105 PowerShell\u2019a, ale zawarte s\u0105 w \u015bcie\u017ckach zadeklarowanych w zmiennej systemowej $PATH (wliczaj\u0105c w to pliki tekstowe, wykonywalne jak i biblioteki DLL)<br \/>\n<code>? Cmdlet<\/code> \u2013 komendy b\u0119d\u0105ce tylko cmdlet\u2019ami (czyli integraln\u0105 cz\u0119\u015bci\u0105 PowerShell\u2019a)<br \/>\n<code>? ExternalScript<\/code> \u2013 pliki zawarte w folderach zadeklarowanych w zmiennej $PATH zawieraj\u0105ce skrypty PowerShell\u2019a (czyli pliki o rozszerzeniu *.ps1)<br \/>\n<code>? Filter<\/code> \u2013 wszystkie filtry PowerShell\u2019a<br \/>\n<code>? Function<\/code> \u2013 wszystkie funkcje PowerShell\u2019a<br \/>\n<code>? Script<\/code> \u2013 wszystkie bloki skrypt\u00f3w (za wyj\u0105tkiem oddzielnych plik\u00f3w, kt\u00f3re zwr\u00f3ci typ ExternalScript<br \/>\n? Workflow \u2013 wszystkie workflow\u2019y dost\u0119pne w PowerShell\u2019u<\/p>\n<p>&nbsp;<\/p>\n<p><code>GET-COMMAND \u2013MODULE NAZWA<\/code><br \/>\nWy\u015bwietla informacje o komendach, kt\u00f3re pochodz\u0105 z okre\u015blonego modu\u0142u lub dodatku.<\/p>\n<pre class=\"lang:sh decode:true\">PS&gt; Get-Command \u2013Module nazwa_modu\u0142u<\/pre>\n<p>&nbsp;<\/p>\n<p><code>GET-COMMAND \u2013NAME WZ\u00d3R<\/code><br \/>\nWy\u015bwietla tylko te komendy, kt\u00f3re zawieraj\u0105 w sobie konkretn\u0105 nazw\u0119 lub wz\u00f3r nazwy, w kt\u00f3rym mo\u017cna stosowa\u0107 wieloznaczniki. Aby dodatkowo uzyska\u0107 list\u0119 wszystkich polece\u0144 o podanej nazwie zaleca si\u0119 stosowanie opcji \u2013All z opcja \u2013Name<\/p>\n<pre class=\"lang:sh decode:true\">PS&gt; Get-Command \u2013all \u2013name wz\u00f3r<\/pre>\n<p>&nbsp;<\/p>\n<p><code>GET-COMMAND \u2013NOUN WZ\u00d3R<\/code><br \/>\nPodaje wszystkie komendy, kt\u00f3rych nazwy zawieraj\u0105 podany rzeczownik w swojej nazwie. Jako<br \/>\nargument mo\u017cna poda\u0107 klika s\u0142\u00f3w, r\u00f3wnie\u017c stosowanie masek jest dozwolone.<\/p>\n<pre class=\"lang:sh decode:true\">PS&gt; Get-Command \u2013Noun rzeczownik<\/pre>\n<p>&nbsp;<\/p>\n<p><code>GET-COMMAND -SYNTAX<\/code><br \/>\nPodaje tylko okre\u015blone informacje na temat poszukiwanej komendy:<br \/>\n? Dla alias\u00f3w \u2013 podaje nazw\u0119 komendy, kt\u00f3r\u0105 uruchamia alias<br \/>\n? Dla cmdlet\u2019\u00f3w \u2013 podaje sk\u0142adni\u0119 polecenia<br \/>\n? Dla funkcji i filtr\u00f3w \u2013 wy\u015bwietla ich definicj\u0119<br \/>\n? Dla skrypt\u00f3w i aplikacji \u2013 wy\u015bwietla \u015bcie\u017ck\u0119 i nazw\u0119 pliku, kt\u00f3ry zostanie uruchomiony<\/p>\n<pre class=\"lang:sh decode:true\">PS&gt; Get-Command \u2013Syntax wz\u00f3r<\/pre>\n<p>&nbsp;<\/p>\n<p><code>GET-COMMAND -TOTALCOUNT<\/code><br \/>\nZwraca okre\u015blon\u0105 ilo\u015b\u0107 komend. Parametr ten jest wykorzystywany, aby ograniczy\u0107 ilo\u015b\u0107 zwr\u00f3conych komend:<\/p>\n<pre class=\"lang:sh decode:true\">Get-Command \u2013TotalCount ilo\u015b\u0107 [dalsze parametry]<\/pre>\n<p>&nbsp;<\/p>\n<p><code>GET-COMMAND -VERB<\/code><br \/>\nZwraca wszelkie mo\u017cliwe parametry, kt\u00f3rych nazwa zawiera podany czasownik. Mo\u017cna stosowa\u0107 kilka czasownik\u00f3w jak r\u00f3wnie\u017c maski w podawanych s\u0142owach.<\/p>\n<pre class=\"lang:sh decode:true\">PS&gt; Get-Command \u2013Verb czasownik<\/pre>\n<p>&nbsp;<\/p>\n<p><code>GET-COMMAND -LISTIMPORTED<\/code><br \/>\nPodaje tylko te komendy, kt\u00f3re dost\u0119pne w bie\u017c\u0105cej sesji. Parametr ten jest przydatny, gdy\u017c od PowerShell 3.0 domy\u015blnie zwracane s\u0105 wszystkie dost\u0119pne komendy, nie tylko te z bie\u017c\u0105cej sesji.<\/p>\n<pre class=\"lang:sh decode:true\">PS&gt; Get-Command \u2013ListImported<\/pre>\n<p>&nbsp;<\/p>\n<p><code>GET-COMMAND -PARAMETERNAME<\/code><br \/>\nZwraca te komendy dost\u0119pne w danej sesji, kt\u00f3re posiadaj\u0105 podane parametry. Mo\u017cna podawa\u0107<br \/>\nnazwy parametr\u00f3w lub ich aliasy. Obs\u0142ugiwane s\u0105 r\u00f3wnie\u017c maski w s\u0142owach.<\/p>\n<pre class=\"lang:sh decode:true\">PS&gt; Get-Command \u2013ParameterName nazwa_parametru<\/pre>\n<p>&nbsp;<\/p>\n<p><code>GET-COMMAND \u2013PARAMETERNAMETYPE<\/code><br \/>\nJako wynik otrzymujemy list\u0119 komend dost\u0119pnych w aktualnej sesji, kt\u00f3re mog\u0105 zosta\u0107 wywo\u0142ane z parametrami okre\u015blonego typu. Mo\u017cna stosowa\u0107 ca\u0142e lub cz\u0119\u015bciowe nazwy typ\u00f3w. Dozwolone jest r\u00f3wnie\u017c stosowanie masek.<\/p>\n<pre class=\"lang:sh decode:true\">PS&gt; Get-Command \u2013ParameterType typ_parametru<\/pre>\n<p>Oczywi\u015bcie polecenie Get-Command oferuje jeszcze inne mo\u017cliwe parametry, z kt\u00f3rymi mo\u017cna je wywo\u0142a\u0107, takie jak: -Verbose, -Debug, -ErrorAction, -ErrorVariable, -OutBuffer czy \u2013OutVariable.<br \/>\nJednak s\u0105 one na tyle rzadko stosowane, \u017ce nie ma potrzeby wspomina\u0107 o nich w kursie podstaw PowerShell\u2019a. Je\u015bli jednak kto\u015b jest zainteresowany dzia\u0142aniem wymienionych parametr\u00f3w, mo\u017ce zawsze skorzysta\u0107 z pomocy PowerShell\u2019a.<\/p>\n<p><code>GET-MEMBER<\/code><br \/>\nWiedz\u0105c ju\u017c jak znale\u017a\u0107 polecenie w\u015br\u00f3d g\u0105szczu funkcjonalno\u015bci zdarza si\u0119, \u017ce nie do ko\u0144ca wiemy jakie w\u0142asno\u015bci czy metody posiada obiekt na kt\u00f3rym dzia\u0142amy. Z pomoc\u0105 przyjdzie nam na tutaj polecenie Get-Member. S\u0142u\u017cy ono, jak z reszt\u0105 wskazuje nazwa, to podpowiedzenia u\u017cytkownikowi jakie elementy sk\u0142adowe posiada obiekt wykorzystywanej klasy.<\/p>\n<pre class=\"lang:sh decode:true\">PS&gt; Get-Member paramerty<\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #3366ff;\">Wy\u015bwietlanie proces\u00f3w<\/span><\/p>\n<pre class=\"lang:sh decode:true\">PS&gt; get-process<\/pre>\n<p>np. get-process -name mail<\/p>\n<p># czyszczenie ekranu<\/p>\n<pre class=\"lang:sh decode:true\">PS&gt; clear<\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #3366ff;\">Pipeliny<\/span><br \/>\nnp. odnalezienie id procesu Mail i zatrzymanie go<\/p>\n<pre class=\"lang:sh decode:true\">PS&gt; Get-process -name Mail | stop-proces<\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #3366ff;\">Zmienne<\/span><br \/>\n&#8211; pozwalaj\u0105 na manipulacje danym gdy zachodzi taka potrzeba<br \/>\n&#8211; zmienne musz\u0105 zaczyna\u0107 sie od znaku $<br \/>\n&#8211; mog\u0105 zawiera\u0107 wynik komendy np.<code> $variable=get-process -name Mail<\/code><\/p>\n<p>Wy\u015bwietlenie wszystich komend zwi\u0105zanych ze zmiennymi<\/p>\n<pre class=\"lang:sh decode:true\">PS&gt; Get-help *variable*<\/pre>\n<p>np.<\/p>\n<pre class=\"lang:sh decode:true\">PS&gt; $processesonmac=get-proces\r\nPS&gt; cat $processesonmac<\/pre>\n<p>np.<\/p>\n<pre class=\"lang:sh decode:true\">PS C:\\&gt; $daysofweek=3\r\nPS C:\\&gt; $daysofweek + 1\r\n4\r\nPS C:\\&gt; $daysofweek + 2\r\n5\r\nPS C:\\&gt; $daysofweek + 2\r\n5<\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #3366ff;\">Operacje na plikach.<\/span><br \/>\nodczyt pliku<\/p>\n<pre class=\"lang:sh decode:true\">PS&gt; cat \/users\/username\/proces.csv<\/pre>\n<p>zapis do pliku<\/p>\n<pre class=\"lang:sh decode:true\">PS&gt; Get-process | out-file --FilePath \/users\/username\/process.csv<\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #3366ff;\">UMO\u017bLIWIENIE WYKONYWANIA SKRYPT\u00d3W<\/span><\/p>\n<pre class=\"lang:sh decode:true\">PS&gt; Set-ExecutionPolicy Unrestricted<\/pre>\n<p><code>- Restricted<\/code> \u2013 uniemo\u017cliwia uruchamianie skrypt\u00f3w<br \/>\n<code>- All Signed<\/code> \u2013 umo\u017cliwia uruchomienie skrypt\u00f3w, kt\u00f3re podpisane s\u0105 przez wiarygodnego tw\u00f3rc\u0119<br \/>\n<code>- Remote Signed<\/code> \u2013 skrypty lokalne mog\u0105 by\u0107 uruchamiane, skrypty \u015bci\u0105gni\u0119te musz\u0105 by\u0107 cyfrowo podpisane<br \/>\n<code>- Unrestructed<\/code> \u2013 mo\u017cna uruchamia\u0107 wszelkie skrypty, nawet te niepodpisane cyfrowo i od niepewnych wydawc\u00f3w.<\/p>\n<p>Znakiem komentarza w PowerShell\u2019u jest znak #.<\/p>\n<pre class=\"lang:sh decode:true\">#\r\n# Te trzy linie s\u0105 zakomentowane\r\n#<\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #3366ff;\">ZNAKI SPECJALNE FORMATOWANIA LINII<\/span><br \/>\nBardzo cz\u0119sto zdarza si\u0119, \u017ce potrzeba z\u0142ama\u0107 lini\u0119 lub z\u0142\u0105czy\u0107 klika instrukcji w jednej, aby kod by\u0142 czytelny.<br \/>\nDo oddzielenia nast\u0119puj\u0105cych po sobie instrukcji w PowerShell\u2019u s\u0142u\u017cy znak<code> ;<\/code><br \/>\nOto przyk\u0142ad jego wykorzystania:<\/p>\n<pre class=\"lang:sh decode:true\">$a = 1; $b = 2; $c = $a + $b;<\/pre>\n<p>Istnieje r\u00f3wnie\u017c mo\u017cliwo\u015b\u0107 z\u0142amania linii z wykorzystaniem znaku <code>`<\/code> .<\/p>\n<pre class=\"lang:sh decode:true\">Write-Host `\r\n\u201eKONTYNUACJA\u201d<\/pre>\n<p>Podobne dzia\u0142anie ma znak<code> |<\/code>, kt\u00f3ry oddziela poszczeg\u00f3lne polecenia, przekazuj\u0105c zar\u00f3wno strumie\u0144 obiektu z jednego cmdlet\u2019a do drugiego:<\/p>\n<pre class=\"lang:sh decode:true\">PS&gt; Get-ChildItem | Sort-Object Size<\/pre>\n<p>Kt\u00f3re wylistuje bie\u017c\u0105cy katalog i posortuje wyniki zgodnie z ich rozmiarem.<\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #3366ff;\">WY\u015aWIETLENIE DANYCH NA KONSOLI<\/span><br \/>\nPodstawowym sposobem na interakcj\u0119 z u\u017cytkownikiem jest pobieranie i wy\u015bwietlanie danych w konsoli. Aby wy\u015bwietli\u0107 dane wykorzystamy cdlet\u2019a Write-Host. Znany wszystkim programistom \u201eHello World!\u201d w przypadku PowerShell\u2019a wygl\u0105da nast\u0119puj\u0105co:<\/p>\n<pre class=\"lang:sh decode:true\">PS&gt; Write-Host \u201eHello world\u201d<\/pre>\n<p>Najprostszym sposobem na zmian\u0119 wizualn\u0105 stylu wy\u015bwietlania komunikat\u00f3w jest wykorzystanie trybu ostrzegawczego konsoli:<\/p>\n<pre class=\"lang:sh decode:true\">PS&gt; Write-Warnig \u201eNieautoryzowany dost\u0119p do danych!\u201d<\/pre>\n<p>Aby wykorzysta\u0107 dowolny kolor z dost\u0119pnej palety, mo\u017cna zastosowa\u0107 argument \u2013foregroundcolor, kt\u00f3ry dla cmdlet\u2019a Write-Host zmieni kolor pierwszoplanowy oraz cmdlet\u2019a \u2013backgroundcolor, kt\u00f3ry zmieni kolor drugoplanowy. Przyk\u0142adowe u\u017cycie wygl\u0105da nast\u0119puj\u0105co:<\/p>\n<pre class=\"lang:sh decode:true\">PS&gt;  Write-Host \u201eChod\u017a, pomaluj m\u00f3j \u015bwiat na \u201e; Write-Host \u201ez\u00f3\u0142to\u201d \u2013foregroundcolor \u201eyellow\u201d ; Write-Host \u201e i na \u201e; Write-Host \u201cniebiesko\u201d \u2013backgroundcolor \u201cblue\u201d<\/pre>\n<p>Jak \u0142atwo zauwa\u017cy\u0107, wpisywany tekst jest \u0142amany dopiero po zako\u0144czeniu polecenia. Aby z\u0142ama\u0107 go wcze\u015bniej wystarczy zawrze\u0107 w miejscu podzia\u0142u ci\u0105g: `n, tak jak w poni\u017cszym przyk\u0142adzie:<\/p>\n<pre class=\"lang:sh decode:true\">PS&gt; Write-Host \u201eTo jest linia pierwsza. `n A to ju\u017c linia druga.\u201d<\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #3366ff;\">POBIERANIE DANYCH Z KONSOLI<\/span><br \/>\nR\u00f3wnie banalne jest pobieranie danych z konsoli. S\u0142u\u017cy ku temu polecenie Read-Host (po raz kolejny zwracam uwag\u0119 na bardzo logiczn\u0105 nomenklatur\u0119 stosowan\u0105 przy nazewnictwie cmdlet\u2019\u00f3w).<\/p>\n<pre class=\"lang:sh decode:true\">PS&gt; $zmienna = Read-Host \u201ePodaj swoje imi\u0119 tajemniczy u\u017cytkowniku:\u201d<\/pre>\n<p>Polecenie przedstawione powy\u017cej spowoduje wy\u015bwietlenie na konsoli monitu o podanie danych i wczytanie danych do zmiennej $zmienna.<\/p>\n<p><span style=\"color: #3366ff;\">POR\u00d3WNYWANIE ZMIENNYCH<\/span><br \/>\nJe\u015bli korzystamy ze zmiennych, b\u0119dziemy je chcieli zapewne por\u00f3wna\u0107. Oczywi\u015bcie cz\u0119\u015b\u0107 z cmdlet\u2019\u00f3w posiada ju\u017c zaimplementowan\u0105 obs\u0142ug\u0119 operator\u00f3w por\u00f3wnania (np. Where-Object).<br \/>\nW PowerShell\u2019u mo\u017cna wykorzysta\u0107 nast\u0119puj\u0105ce operatory por\u00f3wnania:<br \/>\n<code>-lt<\/code> \u2013 mniejsze ni\u017c<br \/>\n<code>-le<\/code> \u2013 mniejsze lub r\u00f3wne<br \/>\n<code>-gt<\/code> \u2013 wi\u0119ksze ni\u017c<br \/>\n<code>-ge<\/code> \u2013 wi\u0119ksze b\u0105d\u017a r\u00f3wne<br \/>\n<code>-eq<\/code> \u2013 r\u00f3wne<br \/>\n<code>-ne<\/code> \u2013 nier\u00f3wne<br \/>\n<code>-like<\/code> \u2013 podobne do (wykorzystuje symbole wieloznaczne i maski)<br \/>\n<code>-notlike<\/code> \u2013 niepodobne do (r\u00f3wnie\u017c wykorzystuje symbole wieloznaczne i maski)<\/p>\n<p>Dodatkowo operatory mog\u0105 rozr\u00f3\u017cnia\u0107 wielkie i ma\u0142e litery. Aby w\u0142\u0105czy\u0107 t\u0105 funkcjonalno\u015b\u0107 nale\u017cy przed symbolem operatora por\u00f3wnania u\u017cy\u0107 litery c. Np. operator \u2013ceg to operator r\u00f3wno\u015bci z uwzgl\u0119dnieniem wielko\u015bci liter.<\/p>\n<p><span style=\"color: #3366ff;\">CZYTANIE DANYCH Z PLIK\u00d3W<\/span><br \/>\nPoweShell umo\u017cliwia r\u00f3wnie\u017c czytanie danych z pliku, przy wykorzystaniu polecenia Get-Content. Jego sk\u0142adnia wygl\u0105da nast\u0119puj\u0105co:<\/p>\n<pre class=\"lang:sh decode:true\">PS&gt; $wczytany_plik = Get-Cotent C:\\Users\\PiotrAblewsi\\pliczek.txt<\/pre>\n<p>Ka\u017cda z linii w pliku taktowana jest jako oddzielna zmienna, kt\u00f3ra znajduje si\u0119 w tablicy. Dosta\u0107 mo\u017cna si\u0119 do niej poprzez numer wiersza w pliku. Zasady numeracji s\u0105 takie same jak w przypadku argument\u00f3w wej\u015bciowych skryptu &#8211; $wczytany_plik[0] to linia pierwsza, $wczytany_pli[10] to linia<br \/>\njedenasta, a $wczytany_plik[-1] to ostania linia w pliku.<br \/>\nAby okre\u015bli\u0107 ilo\u015b\u0107 linii, s\u0142\u00f3w lub znak\u00f3w w pliku, nale\u017cy zastosowa\u0107 polecenie:<\/p>\n<pre class=\"lang:sh decode:true\">PS&gt; Get-Content \u015bcie\u017cka_do_pliku | Measure-Object \u2013line \u2013word \u2013character<\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #3366ff;\">ZAPISYWANIE DO PLIKU<\/span><br \/>\nSkoro umiemy ju\u017c otwiera\u0107 pliki, warto zapozna\u0107 si\u0119 ze sposobami na zapisanie danych do pliku. Oczywi\u015bcie dost\u0119pne s\u0105 wcze\u015bniej wspomniane strumienie plikowe znane jeszcze z czas\u00f3w DOSa, czyli <code>&gt;<\/code>, kt\u00f3ry nadpisuje plik i <code>&gt;&gt;<\/code>, kt\u00f3ry dopisuje do pliku. Jednak stworzony zosta\u0142 cmdlet, kt\u00f3ry umo\u017cliwia zapis do pliku. Jest to Out-File. \u015awietnym przyk\u0142adem zapisu do pliku jest wylistowanie proces\u00f3w uruchomionych na maszynie, tak wi\u0119c w PowerShell\u2019u mo\u017cna zrealizowa\u0107 to na dwa sposoby: Pierwszy, znany ju\u017c z czas\u00f3w DOS\u2019a:<\/p>\n<pre class=\"lang:sh decode:true\">PS&gt; Get-Process &gt; plik<\/pre>\n<p>Celem utworzenia nowego pliku, lub<\/p>\n<pre class=\"lang:sh decode:true\">PS&gt; Get-Process &gt;&gt; plik<\/pre>\n<p>Celem dopisania tre\u015bci do istniej\u0105cego ju\u017c pliku. Drugim sposobem jest zastosowanie cmdlet\u2019a Out-File:<\/p>\n<pre class=\"lang:sh decode:true\">PS&gt; Get-Process | Out-File plik<\/pre>\n<p>Celem nadpisania pliku, lub<\/p>\n<pre class=\"lang:sh decode:true\">PS&gt; Get-Process | Out-File plik \u2013Append<\/pre>\n<p>Celem dopisania danych do istniej\u0105cego pliku. Oczywi\u015bcie dane mo\u017cna zapisa\u0107 w bardziej przyjaznym do obr\u00f3bki formacie CSV, stosuj\u0105c polecenie<br \/>\nExport-CSV:<\/p>\n<pre class=\"lang:sh decode:true\">PS&gt; Get-Process | Export-CSV plik<\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #3366ff;\">DRUKOWANIE DANYCH<\/span><br \/>\nDane w PowerShell\u2019u mo\u017cna przedstawia\u0107 nie tylko na standardowym wyj\u015bciu czy w pliku, ale r\u00f3wnie\u017c mo\u017cna wys\u0142a\u0107 je na domy\u015bln\u0105 drukark\u0119 poprzez polecenie Out-Printer:<\/p>\n<pre class=\"lang:sh decode:true\">PS&gt; Get-Process | Out-Printer<\/pre>\n<p>Spowoduje to wydrukowanie wszystkich proces\u00f3w uruchomionych na naszej maszynie na domy\u015blnej drukarce.<\/p>\n<p><span style=\"color: #3366ff;\">P\u0118TLE I INSTRUKCJE WARUNKOWE<\/span><br \/>\nPowerShell, jako \u017ce jest pe\u0142noprawnym j\u0119zykiem programowania, posiada szereg p\u0119tli i instrukcji, kt\u00f3re mo\u017cna wykorzysta\u0107 przy tworzeniu kodu. Postaram si\u0119 om\u00f3wi\u0107 ich struktur\u0119 w spos\u00f3b na tyle<br \/>\njasny, ze nie b\u0119dzie problemem ich wykorzystanie w trakcie pisania skrypt\u00f3w.<\/p>\n<p><code>IF \u2026 ELSEIF .. ELSE<\/code><br \/>\nPodstawow\u0105 instrukcj\u0105 warunkow\u0105 wykrzystywana przez PowerShell jest poczciwy IF. Jego konstrukcja powinna by\u0107 znana wszystkim programistom, w takiej formie jak w tym przypadku \u2013 programistom tworz\u0105cym skrypty pod pow\u0142oki systemu Linux\/UNIX.<\/p>\n<pre class=\"lang:sh decode:true\">if (warunek1)\r\n{\r\nInstrukcje\u2026\r\n} elseif ( warunek2)\r\n{\r\nInstrukcje\u2026\r\n} else\r\n{\r\nInstrukcje\u2026\r\n}<\/pre>\n<p>Opcje elseif i else s\u0105 oczywi\u015bcie opcjonalne i najprostsza konstrukcja zak\u0142ada wykorzystanie samej<br \/>\nopcji if.<\/p>\n<p><code>SWITCH<\/code><br \/>\nDzi\u0119ki instrukcji Switch mo\u017cna w prosty spos\u00f3b unikn\u0105\u0107 tworzenia wielu instrukcji warunkowych if po sobie.<\/p>\n<pre class=\"lang:sh decode:true \">switch (zmienna)\r\n{\r\nwarto\u015b\u0107_1 {instrukcje}\r\nwarto\u015b\u0107_2{instrukcje}\r\n\u2026 warto\u015b\u0107_n {instrukcje}\r\ndefault {instrukcje wykonane, gdy warunki nie pasuj\u0105}\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<p><code>FOR<\/code><br \/>\nJe\u015bli p\u0119tla ma wykona\u0107 si\u0119 dla okre\u015blonej warto\u015bci zmiennych, najlepszym wyborem b\u0119dzie FOR<\/p>\n<pre class=\"lang:sh decode:true \">for(warto\u015b\u0107_pocz\u0105tkowa; warunek_zako\u0144czenia; inkrementacja_zmiennej)\r\n{\r\nInstrukcje;\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<p><code>FOREACH<\/code><br \/>\nJe\u015bli b\u0119dziemy operowa\u0107 na wi\u0119kszym zbiorze danych, jak na przyk\u0142ad na obiekcie, bardzo pomocna oka\u017ce si\u0119 p\u0119tle Foreach:<\/p>\n<pre class=\"lang:sh decode:true\">foreach ($i in lista_parametr\u00f3w)\r\n{\r\nInstrukcje zale\u017cne od zmiennej $i;\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<p><code>P\u0118TLA WHILE<\/code> \u2013 STEROWANA Z G\u00d3RY<br \/>\nJe\u015bli zale\u017cy nam na wykonywaniu si\u0119 kodu do osi\u0105gni\u0119cia pewnego warunku, mo\u017cna wykorzysta\u0107<br \/>\np\u0119tl\u0119 While. Wykonuje si\u0119 ona dop\u00f3ty, dop\u00f3ki warunek jest spe\u0142niony:<\/p>\n<pre class=\"lang:sh decode:true \">while {warunek}\r\n{\r\nInstrukcje;\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<p><code>P\u0118TLA DO WHILE<\/code> \u2013 STEROWANA Z DO\u0141U<br \/>\nJe\u015bli instrukcje maj\u0105 zosta\u0107 najpierw wykonane, a p\u00f3\u017aniej ma zosta\u0107 sprawdzony warunek (czyli<br \/>\nwykonanie instrukcji nast\u0105pi na pewno minimum raz), mo\u017cemy wykorzysta\u0107 p\u0119tl\u0119 Do While:<\/p>\n<pre class=\"lang:sh decode:true \">do\r\n{\r\nInstrukcje;\r\n} while (warunek)<\/pre>\n<p>&nbsp;<\/p>\n<p><code>DO \u2026 UNTIL<\/code><br \/>\nCiekawostk\u0105 jest r\u00f3wnie\u017c fakt, \u017ce do \u0142ask wr\u00f3ci\u0142a p\u0119tla until sterowana z do\u0142u, a wi\u0119c instrukcja wykona si\u0119 przynajmniej raz i b\u0119dzie wykonywana dop\u00f3ty, dop\u00f3ki warunek nie b\u0119dzie spe\u0142niony:<\/p>\n<pre class=\"lang:sh decode:true \">do\r\n{\r\nInstrukcje;\r\n} until (warunek)<\/pre>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Szybki kurs Powershella. Cz\u0119\u015b\u0107 materia\u0142u pochodzi z referatu Piotra Ablewskiego.<\/p>\n","protected":false},"author":1,"featured_media":2167,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[13],"tags":[],"_links":{"self":[{"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/posts\/2166"}],"collection":[{"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/comments?post=2166"}],"version-history":[{"count":5,"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/posts\/2166\/revisions"}],"predecessor-version":[{"id":2172,"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/posts\/2166\/revisions\/2172"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/media\/2167"}],"wp:attachment":[{"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/media?parent=2166"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/categories?post=2166"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/tags?post=2166"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}