Windows Power Shell Remigiusz Grecki Krzysztof Boryczko Czym
Windows Power. Shell Remigiusz Górecki Krzysztof Boryczko
Czym jest Power. Shell ? Windows Power. Shell (WPS) to oparte na platformie. NET środowisko przeznaczone do zarządzania systemem operacyjnym z poziomu konsoli oraz automatyzowania zadań administracyjnych przy użyciu skryptów.
Cechy środowiska �Zbiór poleceń zaimplementowanych jako aplety poleceń (commandlet). �Zapewnia dostęp do wszystkich obiektów systemowych i aplikacji bibliotek Component Object Model (COM), platformy. NET Framework i interfejsu Windows Management Instrumentation (WMI). �Zapewnia efektywne interakcje między apletami poleceń, dzięki przetwarzaniu potokowemu opartemu na obiektach (interpretery uniksowe pracują na tekście)
Cechy środowiska - cd �Posiada jednolity sposób dostępu do różnych repozytoriów danych, zarówno hierarchicznych (AD, system plików), jak i płaskich (zmienne środowiskowe). �Język skryptowy jest intuicyjny, łatwy do nauczenia. Umożliwia kontrolę błędów na różnych poziomach. �Zastosowany model zabezpieczeń pozwala blokować uruchamianie niepożądanych skryptów. �Posiada możliwość śledzenia wykonania i debugowania. �Możliwy do zintegrowania z dowolną aplikacją.
Historia �Powstał w trakcie prac nad Windows Server 2003 – chodziło o zastąpienie DOS-owego okna wiersza poleceń. �Środowisko WSH (Windows Scripting Host) było trudne w użyciu, wymagało dobrej znajomości zasad programowania obiektowego oraz niespójności i wyjątków modelu COM. � 2002 - Premiera. NET Framework. �X. 2003 – premiera nowej powłoki o roboczej nazwie Monad. �V. 2006 – premiera wersji 1. 0 Power. Shell.
Instalacja � Windows Server 2008 R 2 jest pierwszym, do którego włączono WPS. � Dostępne dla: ◦ ◦ ◦ Windows XP – z Service Pack 2, Windows Server 2003 – z Service Pack 1, Windows Vista, Windows 2008 Windows 7. � Wymaga wcześniejszego zainstalowania. NET Framework w wersji co najmniej 2. 0 z SP 2. � Wersja 2. 0 WPS wyposażona została w edytor i debuger. � Rozszerzenia Powe. Shell Community Extensions (PSCX) dostępne na stronie: www. codeplex. com/Power. Shell. CX � Alternatywny edytor Power. Shell. Plus dostępny na stronie: www. powershell. com
WPS w trybie interaktywnym �Uruchomienie konsoli i wydawanie poleceń z linii komend.
WPS w trybie wykonywania skryptów �Skrypt Power. Shella to plik tekstowy w języku Powershell Script Language (PSL). �Skrypt zawiera deklaracje zzmiennych oraz wywołania apletów.
Power. Shell ISE
Podstawy apletów poleceń � Standardowe polecenie WPS to aplet polecenia (commandlet, cmdlet) lub funkcja. � Aplety są wykonywane zawsze w obrębie głównego procesu WPS. � Na wywołanie apletu składają się najczęściej trzy elementy: 1. czasownik, 2. rzeczownik (w liczbie pojedynczej), 3. lista parametrów (opcjonalna). � Czasownik i rzeczownik są połączone znakiem - , a kolejne parametry oddzielone spacją. � Wielkość liter nie ma znaczenia. � Przykład: PS C: > Get-Process i*
Parametry wywołania apletu (1) �Są traktowane jako ciągi znakowe, niezależnie od tego, czy są ujęte w cudzysłów, czy nie. �Znaki cudzysłowu są opcjonalne poza sytuacją, gdy parametr zawiera znak spacji: PS C: > Get-Child. Item ”C: Program Files”
Parametry wywołania apletu (2) �Jeżeli aplet polecenia posiada więcej niż jeden parametr, można je podawać w ściśle określonej kolejności lub posłużyć się nazwami. Poniższe polecenia mają identyczne działanie: PS C: > Get-Child. Item c: temp *. doc PS C: > Get-Child. Item –Path c: temp –Filter *. doc PS C: > Get-Child. Item –Filter *. doc –Path c: temp
Przełączniki �Przełączniki to parametry nie posiadające wartości. �Samo użycie nazwy takiego parametru aktywuje odpowiednią funkcję. �Przykładowo, rekurencyjne przetwarzanie pliku danych zapewnia przełącznik –recurse: PS C: > Get-Child. Item C: temp -recurse
Parametry określone wyrażeniami �Wartość parametru może być wynikiem obliczenia wartości wyrażenia: PS C: > Get-Child. Item (”C: ” + ”temp”) *. dll –recurse PS C: > Get-Process –id (2800 + 100) �W treści parametrów można korzystać z symboli wieloznacznych: PS C: > Get-Service –exclude ” [k-z]*”
Tryby przetwarzania WPS �Tryb poleceń (normalny) – wszystkie dane wejściowe są traktowane jako ciągi znakowe: ”Hello ”+ ” ” + ”World” �Tryb wyrażeń – umożliwia rozpoznawanie liczb i wyrażeń: Write-Output 10* (8 + 6) �Tryby można łączyć. �Wyrażenie można włączyć do polecenia stosując znaki nawiasów.
Polecenia z wyrażeniami (1) Przykład 2+3 Znaczenie Wyrażenie. Power. Shell wykonuje obliczenie i zwraca liczbę 5. echo 2+3 To jest wyłącznie polecenie. 2+3 jest interpretowane jako ciąg znakowy wypisywany na ekranie. Polecenie, które zawiera wyrażenie. Powoduje wypisanie liczby 5. To jest potok, którego pierwszy stopień to wyrażenie. Wynik wyrażenia zostaje przekazany do drugiego stopnia potoku i na ekranie zostaje wyświetlona liczba 5. echo (2+3) 2+3 | echo
Polecenia z wyrażeniami (2) Przykład Znaczenie echo 2+3 | 7+6 To jest niepoprawna konstrukcja. Wyrażenie może zostać użyte wyłącznie jako pierwszy stopień potoku. $a = Get-Process To jest wyrażenie, które zawiera polecenia. Wynik zwracany przez Get. Process zostaje przekazany do zmiennej. $a | Get-Process To jest potok rozpoczynający się od wyrażenia. Zawartość zmiennej $a zostaje przekazana poleceniu Get. Process jako parametr. Get-Process | $a To jest niepoprawna konstrukcja. Wyrażenie może być wyłącznie pierwszym stopniem potoku.
Aliasy �Pozwalają skrócić wywołania apletów poleceń. �Polecenie Get-Alias (lub jego aliases) pozwala wyświetlić listę predefiniowanych skrótów nazw apletów poleceń. �Listę wszystkich aliasów wybranego apletu (w tym przypadku Get-Process) uzyskamy poleceniem: Get-Alias | Where-Object { $_. definition -eq ”get-process” }
Tworzenie nowych aliasów � Nowy alias można zdefiniować przy pomocy poleceń: ◦ New-Alias – tworzy nowy alias lub zwraca informację o błędzie, jeśli alias o podanej nazwie już istnieje. ◦ Set-Alias – definiuje nowy alias, a jeżeli dana nazwa została już wykorzystana, zastępuje starą definicję nową. � Parametr –description pozwala dołączyć do aliasu jego opis. � Aliasy mogą zastępować nazwy apletów poleceń oraz nazwy zwykłych aplikacji. � Definicje aliasów nie mogą obejmować parametrów – w takim wypadku należy użyć funkcji. � Limit aliasów 4096 (wartość zmiennej $Maximum. Alias. Count – może zostać zmieniona). Set-Alias procs Get-Process New-Alias procs Get-Process Set-Alias np notepad. exe Function Temp { get-childitem c: temp }
Polecenia zewnętrzne � Wszystkie polecenia, które nie zostaną rozpoznane jako aliasy, nazwy apletów poleceń lub wyrażenia są traktowane jako wywołania aplikacji zewnętrznych. � Umożliwia to wykorzystywanie Power. Shella jako tradycyjnej powłoki, pozwalającej uruchamiać aplikacje. � Jeżeli zamiast nazwy polecenia użyta zostanie nazwa pliku, Power. Shell korzysta z ustawień zapisanych w Rejestrze Windows, uruchamia domyślną aplikację i otwiera w niej dokument. � Przy interpretowaniu wywołań, WPS przeszukuje nazwy w następującej kolejności: 1. 2. 3. 4. aliasy, funkcje, aplety poleceń, polecenia zewnętrzne.
Potoki danych �Aplety można łączyć w kolejne stopnie przetwarzania przy użyciu potoków. �W przeciwieństwie do potoków interpreterów poleceń systemu UNIX, potok Power. Shella przekazuje obiekty platformy. NET. �Obiektowe przetwarzanie potoków zapewnia niezależność przetwarzania elementów danych od ich położenia w przekazywanym zbiorze informacji. Get-Process | Where-Object { $_. name –eq ”iexplore” | Format-Table, Working-Set
Typy obiektów �Aplet może przekazać do potoku dowolny obiekt. NET oraz liczby i ciągi znakowe. �Standardem jest jednolite traktowanie klasy i typów pierwotnych. Jednak umieszczanie w potoku ciągu znakowego jest wyjątkiem, gdyż dostęp do obiektów daje większe możliwości. �Specyfikę podejścia obiektowego obrazuje praca z liczbami. Working. Set 64 to 64 -ro bitowa wartość liczbowa, reprezentująca np. wykorzystanie pamięci przez proces. Get-Process | Where-Object { $_. Working. Set 64 –gt 20*1024 } Get-Process | Where-Object { $_. Working. Set 64 –gt 20 MB } ps | ? { $_. ws –gt 20 MB }
Wywołania metod (1) �Obiekty . NET, oprócz właściwości mają także metody, które można wywoływać w potoku obiektów. Obiekty klasy System. Diagnostics. Process mają m. in. metodę kill(). Get-Process iexplore | Stop-Process �Możliwe jest bezpośrednie wywoływanie metody. Get-Process iexplore | Foreach-Object { $_. Kill() } ps | ? { $_. name –eq ”iexplore” } | % { $_. Kill() }
Wywołania metod (2) � Poprzedni przykład działa poprawnie do momentu, w którym w systemie są procesy Internet Explorera. Jeśli wszystkie zostały zakończone, to wywołania Get-Process |iexplore generuje błąd. Stąd polecenie: Get-Process | Where-Object { $_. Name –eq ”iexplore” } | Stop-Process � Filtrowanie realizuje aplet Where-Object. Nie generuje błędu w przypadku braku obiektów. � Aplet Get-Process ma opcję umożliwiającą filtrowanie. Stąd postać: ps –p ”iexplore” | Kill
Filtrowanie napisów �Wywołanie poleceń (ping, netstat) przekazuje do potoku grupę ciągów znakowych. �Każdy wiersz danych wyjściowych jest obiektem typu System. String. �Ciągi takie można analizować przy użyciu apletu polecenia Select-String, będącego rodzajem filtru przekazującego na wyjście tylko te wiersze, których treść pasuje do podanego wzorca.
Dane wyjściowe �Aplet nie powinien formatować danych wyjściowych samodzielnie. �Na ekranie pojawia się wynik działania ostatniego apletu w potoku. �Do formatowania służą aplety: ◦ Out-Default – formatowanie standardowe, zgodne z zapisem w konfiguracji Power. Shella. ◦ Out-Host – działa podobnie jak Out-Default, ale pozwala użyć opcji podziału na strony. ◦ Out-Null – powoduje, że dane wyjściowe nie są wyświetlane. ◦ Format-Wide – lista dwukolumnowa. ◦ Format-List – lista szczegółowa. ◦ Format-Table – tabela.
Formatowanie standardowe �Jeżeli potoku nie kończy wywołanie funkcji formatującej, WPS automatycznie przekazuje dane apletowi Out-Default. �Predefiniowane formatowanie jest zapisane w pliku Dot. Net. Types. Format. ps 1 xml, w katalogu instalacyjnym WPS. �Stąd obiekty System. Diagnostics. Process są standardowo wypisywane w 8 -miu kolumnach.
Dzielenie na strony �Można wymusić przy użyciu parametru –p apletu polecenia Out-Host. Get-Process | Format-List | Out-Host -p
Elementy danych wyjściowych �Polecenia formatujące pozwalają wybierać właściwości do wyświetlania: Get-Process | Format-Table –p id, processname, workingset �Nazwy właściwości można skracać stosując symbol wieloznaczny *: Get-Process | Format-Table –p id, proces*, work*
Wyprowadzanie pojedynczych wartości �Aby wyświetlić ciąg znaków lub wartość zmiennej wystarczy wpisać ciąg lub nazwę zmiennej w wierszu poleceń. �Można w tym celu użyć apletów poleceń: Write-Host, Write-Warn i Write. Error. �Dwa ostatnie generują tekst wyróżniony. �Aplet Write-Host pozwala definiować kolor tekstu: Write-Host ”Hello World” –foregroundcolor red -backgroundcolor green
Blokowanie wypisywania danych wyjściowych �Dopóki skrypt lub okno Power. Shella mają dostęp do standardowego wyjścia, wszystkie dane wyjściowe są wypisywane. �Blokowanie jest możliwe na trzy sposoby: �Użycie apletu polecenia Out-Null na końcu potoku: ps –p ”iexplore” | Out-Null �Zapisanie danych wyjściowych w zmiennej: procs = ps –p ”iexplore” | Kill �Konwersja danych wyjściowych na typ [void]: [void] ( ps –p ”iexplore” | Kill )
Inne funkcje danych wyjściowych �Aplet polecenia Out-Printer wysyła dane do drukarki. Get-Process | Out-Printer ”HP Laser. Jet PCL 6 on E 02” �Aplet polecenia Out-File zapisuje dane do pliku. Get-Process | Out-File ”c: tempprocesy. txt” -Append
Interakcje z użytkownikiem �Tekstowe dane wejściowe można pobierać poleceniem Read-Host:
Okno Input. Box �Proste okno dialogowe można wyświetlić funkcją Input. Box(). �Funkcja jest zdefiniowana w klasie. NET Framework Microsoft. Visual. Basic. Interaction. �Korzystanie z niej wymaga załadowania biblioteki Microsoft. Visual. Basic. dll. [System. Reflection. Assembly]: : Load. With. Partial. Name("Microsoft. Visual. Basic") $input = [Microsoft. Visual. Basic. Interaction]: : Input. Box("Login")
Okno uwierzytelniania �Wyświetlanie systemowego okna uwierzytelniania użytkownika umożliwia aplet polecenia Get-Credential. �Aplet zwraca obiekt System. Management. Automation. PSC redential. �Obiekt zawiera jawnie zapisaną nazwę użytkownika (właściwość User. Name) oraz zakodowane hasło (właściwość Password)
Analiza zawartości potoku �Do tej pory najtrudniejsze było określenie: 1. Typu obiektów, które Power. Shell umieszcza w potoku. 2. Określenie właściwości (zmiennych) oraz metod, które posiadają te obiekty. �Standardowy odpowiedź: opis apletu nie zawsze zawiera Get-Help Get-Service -full �W praktyce pomocne są dwa aplety poleceń: ◦ Get-Pipeline. Info ◦ Get-Member
Get-Pipeline. Info �Pozwala uzyskać trzy ważne informacje o zawartości potoku: 1. Liczba obiektów w potoku (obiekty są ponumerowane). 2. Typy obiektów w potoku (nazwy klas. NET). 3. Reprezentacje obiektów w postaci ciągów znakowych.
Reprezentacja znakowa �Standardowa reprezentacja znakowa obiektu, to wynik metody To. String() pakietu. NET. �Użyteczność wyniku działania metody zależy od badanej klasy: ◦ W przypadku obiektów typu System. Diagnostics. Process jest to nazwa klasy i nazwa procesu. ◦ Konwersja obiektów System. Service. Process. Service. Controller zwracanych przez aplet Get-Service() jest bezużyteczna, gdyż wynik zawiera wyłącznie nazwę klasy.
Get-Member � Aplet polecenia Get-Member() (alias gm) pozwala wyświetlić nazwy klas obiektów w potoku oraz listy ich właściwości i metod. � Klasa. NET ma następujące elementy składowe: ◦ ◦ ◦ ◦ metody (Method), właściwości (Property), zbiory właściwości (Property. Set), właściwości dodatkowe (Note. Property), właściwości skryptowe (Script. Property), właściwości programowe (Code. Property), właściwości aliasowe (Alias. Propert). � Faktycznie tylko elementy Method i Property są składnikami klas. NET. Pozostałe to rozszerzenia dołączane przez WPS.
Metody �To powiązana z obiektem operacja. Przykład to metoda Kill() obiektu Process. �W wywołaniach metod nigdy nie można pominąć znaków (). Wywołanie bez nawiasów pozwala pobrać informacje o metodzie, ale nie powoduje jej wywołania. �Metody mogą odczytywać wartości danych, ustawiać je lub wykonywać inne czynności.
Właściwości � To element danych, który zawiera informacje o obiekcie lub pozwala przekazać do niego pewne dane. Właściwościom towarzyszą zazwyczaj pary metod, np. get_Max. Working. Set() i set_Max_working. Set() służące odpowiednio do odczytywania i modyfikowania właściwości. � Dostęp do danych można uzyskać na 2 sposoby: � Get-Process | Where-Object { $_. name –eq ”iexplore” } | Foreach-Object { $_. Max. Working. Set } Get-Process | Where-Object { $_. name –eq ”iexplore” } | Foreach-Object { $_. get_Max. Working. Set() } � Podobnie zapis: Get-Process | Where-Object { $_. name –eq ”iexplore” } | Foreach-Object { $_. Max. Working. Set = 1412344} Get-Process | Where-Object { $_. name –eq ”iexplore” } | Foreach-Object { $_. set_Max. Working. Set(1412344) }
Właściwości �Zbiór właściwości – to forma ich grupowania. Np. ps. Resources łączy w całość właściwości związane z wykorzystaniem zasobów. �Definicja w pliku types. ps 1 xml. �Zapisane w zbiorze dane można odczytać bez podawania poszczególnych właściwości: Get-Process | Select. Object ps. Resources | Format-Table
Właściwości (2) Właściwości dodatkowe – dodatkowe elementy, które nie są właściwościami. NET ale rozszerzeniami wprowadzonymi przez WPS. � Właściwość skryptowa – to właściwość, której wartość jest wyznaczana, a nie przechowywana w obiekcie. � ◦ Nie oznacza to jedynie obliczeń arytmetycznych. ◦ Wyznaczenie może polegać na odczytaniu wartości podobiektu. Get-Process | Select-Object name, Product ◦ Nazwy produktu, do którego należy dany program nie ma w procesie (nie pokaże manager zadań). Jest zapisana w pliku programu. ◦. NET pozwala na dostęp do tej informacji za pośrednictwem Main. Module. Fileversion. Info. Product. Name. Get-Process | Select-Object name, Mainmodule. File. Version. Info. Product. Name
Właściwości (3) �Właściwość programowa – jest równoważna skryptowej, ale odpowiadający jej kod nie jest skryptem w języku WPS. Definicje te są zapisane w kodzie. NET. �Właściwość aliasowa – to skrócona nazwa innej właściwości. Nie wyznacza się wartości, a jedynie dokonuje translacji nazwy , np. z WS na Working. Set. �Są zdefiniowane w pliku types. ps 1 xml. �Są rozszerzeniami wprowadzonymi na poziomie Power. Shella.
Rozszerzony system typów ETS WPS widzi wiele elementów składowych obiektów, które nie są zdefiniowane w innych klasach. Jednocześnie niektóre elementy dostępne w klasach. NET okazują się niedostępne. Odpowiada za to Extended Type System Power. Shella. � Ukrywanie elementów klas wynika z tego, że są one nie przydatne lub mają lepsze odpowiedniki zapewnione przez rozszerzenia. � Rozwiązanie techniczne polega na opakowaniu każdego obiektu umieszczanego przez aplet w potoku obiektem WPS typu Ps. Object. Implementacja tej klasy decyduje o dostępności dla następnych w potoku apletów i poleceń. � Ostatecznie zbiór elementów składowych obiektu określa się przy użyciu: � ◦ Dla niektórych klas zostały określone adaptery obiektów (Management. Object, Directory. Entry, Data. Row). ◦ Deklaracje w pliku types. ps 1 xml. ◦ Operacje dodawania elementów składowych obiektów wykonane w trakcie pracy apletów poleceń. ◦ Operacje dodawania elementów składowych obiektów wykonane przez aplet Add-Member.
Filtrowanie obiektów � Wynika z potrzeby wybrania do dalszego przetwarzania pewnego podzbioru obiektów, które wykonywany aplet przekazuje do potoku. � Kryterium selekcji może być warunek (np. obiekty o odpowiedniej nazwie) lub pozycja (np. pięć pierwszych). � Operację filtrowania w oparciu o warunek realizuje aplet polecenia Where-Object: Get-Process | Where-Object { $_. ws –gt 1048576 } � Do filtrowania w oparciu o kolejność służy aplet Select-Object w połączeniu z Sort-Object: Get-Process | Sort-Object ws –desc | Where-Object –last 5
Operatory porównania Porównanie z rozróżnianiem wielkości liter Porównanie bez rozróżniania wielkości liter Znaczenie -lt -ilt Mniejsze niż -le -ile Mniejsze lub równe -gt -igt Większe niż -ge -ige Większe lub równe -eq -ieq Równe -ine Różne -like -ilike Podobieństwo ciągu -notlike -inotlike Brak podobieństwa ciągu -match Dopasowanie do wzorca (wyrażenia regularne) -notmatch Brak dopasowania do wzorca -is Dopasowanie typu
Operatory logiczne Opertator Znaczenie -not lub ! Negacja -and Koniunkcja -or Alternatywa Get-Process | Where-Object { $_. ws –gt 1048576 –and $_. name –eq ”firefox” } Get-Process | Where-Object { $_. Display. Name –match ”^w* w*$” }
Agregacja zawartości potoku �Obiekty w potoku mogą mieć różne typy. Przykładowo, polecenie Get-Child. Item wykonane na systemie plików, przekazuje do potoku obiekty File. Info i Directory. Info. �Można też połączyć dwa polecenia, które wysyłają obiekty różnych typów do potoku: $( Get-Process ; Get-Service ) �Operacja taka ma sens tylko wtedy, gdy kolejne polecenia potoku są w stanie wykonać operacje na obiektach różnych typów. W innym przypadku typ pierwszego obiektu może warunkować sposób przetwarzania całego potoku. $( Get-Process i* ; Get-Service i* ) | Get-Pipeline. Info
Przycinanie obiektów �Przekazywane obiekty często zawierają wiele niepotrzebnych elementów składowych. �Odpowiednie ich odfiltrowanie pozwala zmniejszyć wykorzystanie zasobów i zwiększyć przejrzystość danych wyjściowych. �Operację pozwala przeprowadzić aplet Select-Object: Get-Process | Select-Object Process. Name, get_min. Working. Set, ws | Get-Member �Operacja uboczne: przycięcia może mieć skutki ◦ Brak właściwej nazwy klasy. ◦ Elementy składowe zostają przekształcone we właściwości dodatkowe.
Sortowanie obiektów �Do sortowania obiektów służy aplet polcenia Sort-Object. �Standardowy porządek jest rosnący. Zmiana kolejności sortowania przełącznikiem –desc: Get-Process | Sort-Object -desc �Domyślnie sortowanie po pierwszej własności. Zmiana przy pomocy przełącznika –property: Get-process | select-object id, pm, name | sort –desc –property id
Grupowanie obiektów �Grupowanie obiektów w potoku wg wskazanej właściwości realizuje aplet Group-object : Get-Service | group-Object status �Jeżeli jedynym celem jest wyświetlenie grup i zliczanie obiektów nie jest potrzebne, można użyć wywołania Select-Object z parametrem –unique : Get-Child. Item | Select-Object extension -Unique
Obliczenia �Na obiektach potoku obliczenia wykonuje aplet Measure-Object. �Możliwe są: określenie liczności, znalezienie wartości minimalnej lub maksymalnej, sumy, średniej. �Wymagane jest określenie nazwy właściwości, na której będzie wykonywana wskazana operacja. Get-Child. Item | Measure-object –Property length –min –max –average -sum
Wartości pośrednie � Polecenie potokowe może mieć praktycznie dowolną długość. Można je jednak podzielić na fragmenty. � Do przenoszenia zawartości potoku między kolejnymi poleceniami służą zmienne. � Zmienne w WPS wyróżnia zawsze znak $ na początku nazwy. � Usuwanie wartości zmiennej realizuje aplet Clear. Variable. Pobiera nazwę zmiennej bez znaku $. Get-Process | Where-Object { $_. name –eq ”firefox” } | For. Each-Object { $_. ws } $x = Get-Process $y = $x | Where-Object { $_. name –eq ”firefox” } $y | For. Each-Object { $_. ws }
Porównywanie obiektów �Aplet Compare-Object pozwala porównać zawartość dwóch potoków. $przed = Get-Process cmd $po = Get-Process Compare-Object $przed $po
Rozgałęzienia �Są wykorzystywane, jeśli wyniki pracy apletu mają zostać przekazane dalej w potoku oraz zapisane do zmiennej lub pliku. �Zostały zaimplementowane w aplecie Tee. Object. �Nazwę zmiennej podaje się po przełączniku – var i bez znaku $. �Podanie ścieżki dostępu do pliku wymaga użycia przełącznika –filepath. Get-Service | Tee-Object –var a | Where-Object { $_. Status –eq ”Running” } | Tee-Object –filepath c: tmpuslugi. txt
Uniwersalny model nawigacji �Power. Shell implementuje niezależny od repozytorium model nawigacji. Podstawowe repozytoria to: ◦ ◦ Zmienne środowiskowe (env). Klucze Rejestru Windows (HKCU, HKCL). Magazyn certyfikatów (cert). Aliasy (alias), zmienne (Variable) i funkcje Power. Shell (function). �Aplet Get-Child. Item pracuje na każdym z repozytoriów.
Rejestr systemu Windows � Praca z rejestrem nie różni się od pracy z systemem plików. � Przejście do klucza HKEY_LOCAL_MACHINESoftware: cd hklm: software Set-Location hklm: software � Lista podkluczy klucza bieżącego: Dir Get-Child. Item � Tworzenie podklucza md IT-Vision o nazwie IT-Vision: � Tworzenie podklucza z zawartością standardową: New-Item –name ”Witryna” –value ”www. wszib. edu. pl” –type string
Dostawcy danych i dyski �Aplet Get-PSDrive wypisuje listę „dostawców danych”. �Każdy z dostawców zapewnia ujednolicony dostęp metodami Get, Set, New, Remove. �WPS jest wyposażony w dostęp do: ◦ ◦ ◦ ◦ Systemu plików. Rejestru systemu. Zmiennych środowiskowych. Magazynu certyfikatów. Funkcji Power. Shella. Zmiennych Power. Shela. Aliasów Power. Shela.
Aplety poleceń do nawigacji w repozytoriach danych Aplet polecenia Aliasy Opis Get-Child. Item dir, ls Lista obiektów podrzędnych Get-Cwd cd, pwd Zmiana katalogu bieżącego Get-Content type, cat Wywołanie zawartości elementu New-Item mkdir Tworzenie elementu (gałęzi lub liścia) Get-Location Set-Location Informacja o katalogu bieżącym cd Zmiana katalogu bieżącego Get-Content c: tmppamm. c
Ścieżki �Podstawowe symbole stosowane w zapisie ścieżek dostępu do obiektów: �. . . ~ Get-Child. Item c: windows[a-dw]*. * �Aplet Test-Path sprawdza, czy ścieżka istnieje. Zwraca wynik True lub False. Test-Path c: tmp �Aplet Resolve-Path analizuje symbole wieloznaczne i wypisuje jej pełną postać: Resolve-Path ~
Definiowanie dysków � Model nawigacji WPS przewiduje możliwość definiowania nowych dysków, które można wykorzystać m. in. jako skróty zastępujące długie nazwy ścieżkowe. New-PSDrive –Name Home –PSProvider File. System -Root „c: documents and Settingsfranio” � Nowo zdefiniowany dysk jest dostępny jedynie w bieżącej konsoli WPS i nie jest dostępny dla innych aplikacji. � Podobnie można definiować skróty do kluczy rejestru. � Ograniczenie liczby dysków to 4096. Można je zmienić modyfikując zmienną $Maximum. Drive. Count.
Język skryptów Power. Shell
System pomocy �Opisy elementów składniowych języka skryptowego Power. Shell można wypisać podobnie jak opisy apletów poleceń. �Nazwy dokumentów opisujących konstrukcje języka rozpoczynają się od słowa „About”: Get-Help About_for
Rozdzielanie poleceń �Ogólnie jeden wiersz skryptu, to jedno polecenie. �W wierszu można umieścić kilka poleceń rozdzielając je znakiem ; . �Na końcu każdej linii może znajdować się znak ; ale nie jest to wymagane. �Jeśli jedno polecenie musi zostać zapisane w kilku wierszach, należy użyć znaku odwróconego apostrofu ` : Gps | ` format-list
Zmienne � Nazwy zmiennych rozpoczyna znak $. � Nazwa może zawierać litery i cyfry oraz znak _. � Część nazw jest zarezerwowana dla zmiennych predefiniowanych $_. � Określanie typu zmiennej nie jest wymagane, może on jednak zostać zadeklarowany: $a = 5 $a = [int] 5 $a = [System. Date. Time] ” 2006 -01 -22” � Typy WPS odpowiadają klasom. NET: typy [int], [System. Int 32] i [int 32] są identyczne. � Umieszczenie nazwy typu tuż przed wyrażeniem przypisania trwale przypisuje typ zmiennej.
Typ zmiennej �W chwili przypisania wartości następuje niejawne zadeklarowanie zmiennej. �Jeśli jednak typy zmiennych nie są deklarowane, mogą pojawić się błędy wynikające z błędnego określania typu. �Deklaracja ma określony zakres (skrypt, procedura lub blok kodu). �Deklarację można usunąć apletem Remove-Variable. �Zalecane użycie polecenia Set. PSDebug –Strict.
„Szybkie typy” Power. Shella Oznaczenie Typ [int] typeof (int) [int[]] typeof (int[]) [long] typeof (long) [long[]] typeof (long[]) [string] typeof (string) [string[]] typeof (string[]) [char] typeof (char) [char[]] typeof (char[]) [bool] typeof (bool) [bool[]] typeof (bool[]) [byte] typeof (byte) [double] typeof (double) [decimal] typeof (decimal) [float] typeof (float)
„Szybkie typy” - cd Oznaczenie Typ [single] typeof (float) [regex] typeof (System. Text. Regular. Expression. Regex) [array] typeof (System. Array) [xml] typeof (System. Xml. Document) [scriptblock] typeof (System. Management. Automation. Sctipt. Block) [switch] typeof (System. Management. Automation. Switch. Parameter) [hashtable] typeof (System. Collections. Hashtable) [type] typeof (System. Type) [ref] typeof (System. Management. Automation. PSReference) [psobject] typeof (System. Management. Automation. PSObject) [wmi] typeof (System. Management. Object) [wmisearcher] typeof (System. Management. Object. Searcher) [wmiclass] typeof (System. Management. management. Class)
Sprawdzanie typu zmiennej �Informacje o typie są dostępne niezależnie od tego, czy typ zmiennej został jawnie określony. �Metoda Get. Type () zwraca typ zmiennej w postaci obiektu System. Type. �Każda zmienna WPS to obiekt klasy. NET, więc metoda ta jest zawsze dostępna. �Pełną nazwę (z obszarem nazw) pobieramy z właściwości Full. Name, zaś krotką z Name.
Zmienne predefiniowane �To zmienne Power. Shella. �Ich właściwa nazwa to zmienne zintegrowane lub zmienne wewnętrzne. �Wszystkie zadeklarowane zmienne, wewnętrzne i użytkownika można wyświetlić poleceniem: Get-Child. Item Variable: dir Variable:
Zmienne predefiniowane Funkcja Opis $true Wartość „prawda” $false Wartość „fałsz” $OFS Separator stosowany przy wyświetlaniu zbioru obiektów $Home Katalog macierzysty użytkownika $PSHome Katalog macierzysty Power. Shella $Args Parametr (przy wywołaniach funkcji) $Input Zawartość potoku (do użytku w funkcjach) $_ Bieżący obiekt potoku (do użytku np. w pętlach) $Stack. Trace Bieżąca sekwencja wywołań $Host Informacje o „hoście” WPS $Last. Exit. Code Wartość zwrócona przez ostatnio wykonany program konsoli lub zewnętrzną aplikacje Windows $Error Pełna lista błędów od uruchomienia Power. Shella. Ich liczbę określa zmienna $Maximum. Error. Count
Podstawianie zmiennych �Zasada podstawiania zmiennych jest stosowana nie tylko w typowych wyrażeniach, ale również wewnątrz ciągów znakowych. Jeżeli: [int] $licznik = 1 [string] $Komputer = ”messy” �to zamiast: $licznik. To. String() + ”Dostep do komputera ” + $Komputer �można napisać: ”$licznik. Dostep do komputera $Komputer” �W obu przypadkach wartość ciągu jest ta sama: ” 1. Dostep do komputera messy”
Podstawianie zmiennych - cd �Z podstawiania zmiennych można korzystać w wywołaniach apletów poleceń: Get-Directory. Entry (”Win. NT: //” + $Komputer) Get-Directory. Entry ”Win. NT: //$Komputer” � Mechanizm podstawiania zmiennych obejmuje również obliczanie wartości wyrażeń. Po znaku $ można umieścić w ciągu znakowym dowolne wyrażenie, którego wartość zostanie włączona do ciągu wynikowego: ” 1+3=$(1+3)” ”Godzina: $((Get-Date). To. Short. Time. String())” � Podstawianie zmiennych nie zostanie przeprowadzone, jeśli ciąg zostanie zapisany przy użyciu znaków apostrofu zamiast cudzysłowiu: ‘$licznik. Dostep do komputera $Komputer’
Liczby � Konstruktorami wartości liczbowych mogą być literały liczby, wyrażenia i zakresy. � Liczby szesnastkowe poprzedza się znakami 0 X i można je stosować wszędzie tam, gdzie liczby dziesiętne. � Jeżeli następuje przypisanie literału liczby do zmiennej, której typ nie został jawnie określony, WPS tworzy obiekt typu System. Int 32. � Jeśli zakres wartości nie jest wystarczający, stosowany jest typ Int 64 lub Decimal. � Jeśli literał jest ułamkiem, WPS deklaruje typ Double lub Decimal. � Aby przypisać zmiennej typ danych, należy poprzedzić deklarację nazwą typu. W przypadku typu Decimal istnieje możliwość zadeklarowania typu poprzez dodanie litery d. � Skróty KB, MB i GB pozwalają używać jednostek kilo-, mega- oraz gigabajta.
Liczby pseudolosowe �Do generowania liczb pseudolosowych służy aplet Get. Random. �Standardowo generuje liczby typu double z przedziału od 0 do Int 32. Max. Value. �Przedział wartości można zmienić przy użyciu parametrów –Min i –Max. �Istnieje możliwość wyboru wartości losowych z danego zbioru.
Ciągi znakowe �WPS pozwala korzystać ze wszystkich metod klasy System. String, a wtym m. in. z: Insert(), Remove(), Replace() i Split(). �Pełną listę metod udostępnia polecenie: ”” | Get-Member –m method
Dzielenie i łączenie ciągów znakowych �Aplet polecenia Split-String umożliwia podzielenie napisu na fragmenty w miejscach wskazanych przez znaki. �Odpowiednikiem jest metoda Split() klasy System. String. �Analogicznie, do łaczenia ciągów służy metoda Join() oraz aplet polecenia Join-String.
Data i godzina Aplet polecenia Get-Date tworzy obiekt System. Date. Time klasy. NET, który zawiera bieżącą datę i godzinę. � Redukcja danych wyjściowych przy pomocy przełącznika – displayhint : Get-Date –displayhint date Get-Date –displayhint time � Można obliczyć różnicę między bieżącą datą i godziną, a datą i godziną zapisaną w zmiennej (metoda Substract() lub operator - ): (Get-Date). Substract((Get-Date ” 1992 -05 -12 03: 11: 25”)) (Get-Date) – (Get-Date ” 1992 -05 -12 03: 11: 25”) � Różnice czasu są tworzone jako obiekty klasy System. Time. Span. Można je tworzyć poleceniem New. Timespan : � $Przedzial = New-Timespan –Days 10 –Hours 7 –Minutes 6 –Seconds 2 $Teraz = Get-Date $Koniec = $Teraz + $Przedzial
Uzupełnienie �Aplet Get-Date nie pozwala pobrać czasu ze zdalnego komputera. Umożliwia to klasa WMI Win 32_Currenttime : Get-Wmiobject Win 32_Currenttime –computername messy �Zmianę daty i godziny umożliwia polecenie Set-Date.
Tablice �Deklaracja tablicy następuje w momencie przypisania zbioru wartości oddzielonych przecinkami: $a = ”Ala ma kota”, ”misiek”, 12 $a = , ”Tylko jeden element” �Tablicę można zadeklarować jawnie używając identyfikatora typu WPS [Array]: [Array] $b $b 1, 3, 6, 89 [Array] $a = ”Tylko jeden element” [Array] $b = �Aby wykonać operacje na wszystkich elementach tablicy, należy użyć apletu polecenia For. Each-Object: $i = 0 $b | Foreach-object { $b[i]; $i ++ }
Tablice - cd � Właściwość Count pozwala uzyskać informację o liczbie elementów w tablicy: $b = 1, 6, 90, 45; $b. Count � Dostęp do elementu po podaniu indeksu lub zakresu indeksu: $b[1. . 3] � Dodanie elementu do tablicy realizuje operator += : $b += 22; $b. Count � Tablice można łączyć operatorem + : $a = ”Jan”, ”Ala”; $c = $a + $b � Dostępne są tablice wielowymiarowe. Tworzymy ją łącząc elementy listy w grupy, stosując znaki ( ) : $Kompy = (”dns 1”, ” 172. 31. 1. 10”, ”krakow”), ‘ (”dns 2”, ” 172. 31. 2. 10”, ”wroclaw”)
Tablice asocjacyjne � To listy nazwanych elementów, zaimplementowane jako tablice (tabele) skrótów. � Element w tablicy identyfikuje nie pozycja, ale pewna wartość nazwana kluczem. � Tabelę skrótów tworzymy używając znaku @ oraz listy elementów ujętych w nawiasy wąsate { }. Kolejne elementy rozdziela średnik ; . � Każdy element składa się z nazwy i wartości, rozdzielonych znakiem =. Nazwy nie można ująć w cudzysłów. � Identyfikatorem typu jest [Hashtable]: $Kompy 1 = @{ dns 1 = ” 172. 31. 1. 10”; dns 2 = ” 172. 31. 2. 10”; ` dns 3 = ” 172. 31. 3. 10”; } [hashtable] $Kompy 2 = @{ dns 4 = ” 172. 31. 4. 10”; dns 5 = ” 172. 31. 5. 10”; ` dns 6 = ” 172. 31. 6. 10”; }
Tablice asocjacyjne - cd � Dostęp do elementu tablicy przez zastosowanie [] lub notacji z. : $Kompy 1[”dns 1”] $Kompy 2. dns 4 � Przypisanie wartości elementu: $Kompy 2. dns 4 = ” 172. 31. 21. 10” � Istnieje możliwość generowania tabeli od listy pustej począwszy: $Kompy 3 = @{ } $Kompy 3. dns 7 = ” 172. 31. 7. 10” � Tabele skrótów można łączyć tak samo, jak zwykłe tablice. Nazwy elementów w obu tabelach nie mogą się powtarzać. $Kompy 309 = $Kompy 1 + $Kompy 2 + $Kompy 3
Operatory �PWS pozwala korzystać z podstawowych operatorów arytmetycznych: +, -, *, /, %. �Znak + służy do dodawania, łączenia ciągów oraz tablic. �Znak * służy do mnożenia liczb oraz zwielokrotniania ciągów znakowych i tablic (oprócz tablic asocjacyjnych). $Ciag = ”abcdefghijklmno” $Ciag 2 = $Ciag * 20; $Ciag 2. Length $Tablica = 1, 2, 3, 4, 5 $T = $Tablica * 10; $T. Count
Operatory - cd �Znak = to operator przypisania. WPS umożliwia przypisania krzyżowe umożliwiające elegancką formę wymiany wartości dwóch zmiennych: $x, $y = $y, $x �Operator & może służyć do wykonania polecenia, którego nazwa jest zapisana w ciągu znakowym: $Co = ”Process” & (”Get-”+$Co) �Operator & można zastąpić apletem polecenia Invoke-Expression: $Co = ”Process | Stop-Process” Invoke-Expression(”Get-”+$Co)
Struktury sterujące �Język skryptów Power. Shella PWL udostępnia następujące struktury sterujące: if (warunek) {…} else {…} switch ($zmienna) {wartosc 1 {…. } wartosc 2 {…} default {…} } } while(warunek) {…} do {…} while (warunek) do {…} until (warunek) for ( wart_pocz; warunek_konca; zmiana_wartosci ) {…} foreach ($zmienna in $kolekcja) {…} function nazwa {…} break continue return exit trap błąd class {…} else {…} throw ”informacja o błędzie” throw obiekt błędu
Pętle #Petla for od 1 do 5 for ( $i = 1; $i –lt 6; $i++) { $i } #Petla while $i = 0 while ( $i –lt 5 ) { $i++ $i } #Petla foreach $i = 1, 2, 3, 6, 7 Foreach ( $zmienna in $i ) { $zmienna }
Warunki if ($i –lt 10) { ”Instrukcja wykonywane gdy wartosc i<10” } else { ”Instrukcja wykonywane gdy wartosc i>=10” } # switch ($i) { 1 { ”Instrukcje dla 1” } 5 { ”Instrukcje dla 5” } 7 { ”Instrukcje dla 7” } default { „Inna liczba” } }
Funkcje function Parametry. Nie. Nazwane () { ”funkcja dostała parametry: $args[0] oraz $args[1]” return $args[0] + $args[1] } # # function Parametry. Nazwane ([int] $a, [int] $b) { ”funkcja dostała parametry: $a oraz $b” return $a + $b }
Przykładowy skrypt #Odczyt z pliku tekstowego i wstawienie do tablicy napisow #Format linii: Imie Nazwisko, login, haslo $a = Get-Content c: tmpdane. txt [Array] $tab = $a | Foreach-Object { $d = $_. split(", "); $d; $tab += $d } $n = $tab. count $n for ( $i = 0; $i -lt $n; $i = $i + 3 ) { $tab[$i]+" "+$tab[$i+1]+" "+$tab[$i+2] }
Uruchamianie skryptów Aby uruchomić skrypt Power. Shella, należy wprowadzić nazwę pliku z lub bez rozszerzenia. � Opcjonalnie można użyć apletu polecenia Invoke-Expression lub operatora &. � Ścieżka dostępu może być względna lub bezwzględna, zależnie od tego czy katalog, w którym znajduje się plik skryptu wchodzi w skład wartości zmiennej Path czy nie: � skrypt 1. skrypt 1. ps 1 & skrypt 1. ps 1 Invoke-Expression skrypt 1. ps 1 � Skrypt WPS można także uruchomić ze zwykłego okna wiersza poleceń : powershell. exe skrypt 1 powershell. exe. skrypt 1. ps 1 powershell. exe c: tmpskrypt 1. ps 1 � Skrypty WPS podlegają tym samym ograniczeniom jak skrypty WSH w zakresie kontroli konta użytkownika.
Włączanie skryptu �Włączanie źródła kropką, to mechanizm umożliwiający wywołanie skryptów w sposób, który powoduje, że wszystkie zawarte w nim definicje pozostaną dostępne dla bieżącej konsoli WPS. �Zatem wszystkie zadeklarowane w skrypcie zmienne i funkcje pozostaną dostępne po zakończeniu jego wykonywania. �Jest to zatem prosty sposób na rozszerzanie funkcji Power. Shella. cd c: tmp. . skrypt 1. ps 1
Zabezpieczenia �Funkcje wykonywania skryptów w programach Internet Explorer, Outlook czy WSH okazały się zagrożeniem dla bezpieczeństwa systemów. �Stąd próba użycia konsoli WPS do uruchomienia skryptu kończy się niepowodzeniem. �Domyślnie zasady wykonywania skryptów blokują wykonanie jakiegokolwiek pliku. �Pierwsze wirusy WPS powstały jeszcze przed wprowadzeniem pierwszej wersji narzędzia.
Zasady wykonywania skryptów �Użytkownik może korzystać ze skryptów Power. Shella dopiero po obniżeniu poziomu zabezpieczeń. �Służy do tego aplet polecenia Set. Execution. Policy. Dostępne tryby to: ◦ Restricted – domyślny, uniemożliwia uruchomienie jakiegokolwiek apletu. ◦ All. Signed – pozwala uruchamiać skrypty podpisane tylko przez zaufanych wydawców. ◦ Remote. Signed – podpis zaufanego wydawcy jest wymagany tylko dla skryptów pobieranych z Internetu i innych zasobów sieciowych. Skrypty lokalne nie muszą mieć podpisu. ◦ Unrestricted – można uruchamiać wszystkie skrypty.
- Slides: 95