JustPaste.it

PowerShell - kilka wskazówek

PowerShell to zaawansowana powłoka skryptowa zawarta w nowych wydaniach systemu Windows, niosąca za sobą olbrzymie możliwości.

PowerShell to zaawansowana powłoka skryptowa zawarta w nowych wydaniach systemu Windows, niosąca za sobą olbrzymie możliwości.

 

Jednym z moich ostatnich celów jest spopularyzowanie PowerShella. Dziś wiedzą o nim jedynie nieliczni, jednak Microsoft PowerShell to potężne narzędzie - to język skryptowy potężniejszy niż wszystkie inne.
Języki skryptowe dostępne są praktycznie w każdym systemie operacyjnym, pomagając administratorom, czasami ich całkowicie zastępując przy wykonywaniu żmudnych czynności - przykładowo, w tym artykule zaprezentuje dość przydatny skrypt wykonujący wsadową zmianę nazw plików.


Windows, na przestrzeni lat, posiadał kilka "swoich" (czyt. wbudowanych) języków skryptowych. Były nimi: pliki wsadowe BAT (pamiętacie?), "Host skryptów systemu Windows" (o którym praktycznie mało kto dzisiaj pamięta - jednocześnie zarzucając rodzinie Windows brak rozbudowanego języka skryptowego ;), no i wreszcie PowerShell. O ile serwer "Host skryptów systemu Windows" umożliwiał uruchamianie skryptów napisanych w już istniejących językach jak JavaScript i VisualBasic Script (odpowiednio rozszerzenia .js i .vbs), o tyle PowerShell to zupełnie nowy język, stworzony od podstaw - zgodnie z dzisiejszym nurtem myśli technicznej - całkowicie obiektowy. Obiektowość w tym przypadku przekłada się jednak na coś więcej - język posiada dostęp do składników platformy .NET (a więc metod i pól obiektów .NET).


Nie muszę chyba mówić co to znaczy? Dla osób niezorientowanych w temacie platformy .NET (która tak na marginesie powstała dlatego, że sąd zakazał Microsoft'owi tworzenia własnych, rozbudowanych implementacji języka Java firmy Sun - Microsoft stworzył więc własną, przenośną platformę .NET - czyt. "dot net" ) mogę jedynie powiedzieć - mamy łatwy dostęp do praktycznie każdego zakamarka systemu - a takie cudo jak WQL jeszcze bardziej nam to ułatwia. Co to jest WQL? Cóż - osoby znające język zapytań bazodanowych SQL powinny dostrzec analogię pomiędzy oboma akronimami. I będą miały rację. Jak dla mnie coraz większa integracja z .NET, praktycznie pełna obiektowość i WQL to jedna z większych zalet nowych Windowsów. Bo o ile oczywiście zewsząd można dzisiaj słyszeć mnóstwo narzekania na nowy system Vista, to tak naprawdę wszystko praktycznie sprowadza się do bajerów graficznych, które "podobno" wolno chodzą na starszych komputerach (to po co je włączać?), podsystemu kontroli konta użytkownika (który można wyłączyć za pomocą 5 kliknięć - Tak! Policzyłem kliknięcia!) i zużycia pamięci (Tak, to ostatnie daje rzeczywiście znać o sobie w nowszych grach, nawet przy 2GB RAMu). Niestety widać tu jakże obecną cechę człowieka do kierowania się powierzchownością podczas oceny. Osoby naprawdę znające się na rzeczy i będące przy zdrowych zmysłach (nikogo nie obrażając nie mam tu na myśli fanatycznych zwolenników konkurencyjnych systemów ;) od razu zauważą że "pod maską" sporo się zmieniło. Wbrew temu co zapowiadano (a zapowiadno, że znakomita większość systemu Vista będzie przepisana na .NET), okazało się, że system Vista jest hybrydą - czyli połączeniem systemu operującego na starym WinAPI, z systemem korzystającym z platformy .NET. Przy czym na .NET nie zostało przepisane zbyt wiele kodu - jednak wystarczająco wiele by niektóre składniki systemu zyskały nowy ład, obiektowość i możliwość dostępu przez PowerShell. Niech przykładem będzie WMI - czyli instrumentacja zarządzania systemu Windows (http://msdn.microsoft.com/en-us/library/ms257340(VS.80).aspx). Co kryje się pod tą dziwną nazwą? Cóż, za pomocą WMI możemy odczytywać praktycznie wszystkie informacje o podłączonym sprzęcie takie jak ilość podłączonych procesorów (rdzeni również), adres MAC karty sieciowej, ale również listę uruchomionych procesów, a nawet odczyt napięcia z woltomierzy na płycie głównej (i tym podobne rzeczy - jednym słowem uzyskiwanie informacji o sprzęcie i działających usługach). Z WMI można korzystać na dwa sposoby - jednym z nich jest przebicie się przez kolejne obiekty, natomiast drugim jest właśnie WQL. WQL umożliwia nam wykonywanie zapytań - dokładnie takich jak SQL, ale kierowanych do systemowej bazy danych. I to właśnie w systemowej bazie danych przechowywane są wymienione wyżej informacje. Prawda, że przełomowe podejście? Chcesz uzyskać informacje o wspomnianym wyżej adresie MAC karty sieciowej o określonej nazwie? Nic prostszego - wystarczy jedno zapytanie WQL! Proszę bardzo:

SELECT MACAddress FROM Win32_NetworkAdapter WHERE Name LIKE '%$nazwa_karty%'

Powyższy przykład pochodzi akurat z jednego z moich skryptów.

Przykładowe skrypty

Czas na przedstawienie kilku przykładowych skryptów. Pierwszym z nich będzie...

Wsadowa zmiana rozszerzeń plików

Skrypt zmienia wsadowo wszystkie wybrane rozszerzenia w podanym katalogu na zadane.
  Ważne jest, że udało mi się go napisać tak by działał w PowerShellu 1.0 (wszystkie sposoby zmiany rozszerzeń używają elementu basename, który występuje dopiero od PS 2.0).

[ ze względu na małe ograniczenia serwisu Eioba - kod skryptu umieściłem w załączniku ]

Szybkie info o aktualnym IP, wybranego interfejsu

Szybkie info o aktualnym IP, wybranego interfejsu sieciowego:

[ ze względu na małe ograniczenia serwisu Eioba - kod skryptu umieściłem w załączniku ]

Rozwiązania typowych problemów

Podczas pracy z PowerShellem (w wersji 1.0) przytrafiło mi się kilka niedogodności (bo tego problemami nawet nie można nazwać), które chciałbym tutaj opisać i przedstawić ich rozwiązania.

Zmiana standardowego prompta (znaku zachęty)

Krótko opiszę, jak zmienić prompt w PowerShell'u - bo to fajne jest. (Więcej przykładowych promptów znajdziecie pod poniższym adresem: http://mshforfun.blogspot.com/2006/05/perfect-prompt-for-windows-powershell.html)

  1. Szukamy pliku (ścieżka ilustrowana na Windows Vista):
    C:\Users\NAZWA_UZYTKOWNIKA\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
    (jeśli nie ma takiego katalogu ani pliku to je tworzymy)
  2. W pliku Microsoft.PowerShell_profile.ps1 odnajdujemy funkcję prompt() i modyfikujemy ją, np w ten sposób:
    (jeśli plik jest pusty to dodajemy tą funkcję do pliku)

    function prompt()
    {
      Write-Host "H" -foregroundcolor "cyan" -nonewline;
      Write-Host "a" -foregroundcolor "magenta" -nonewline;  
      Write-Host "c" -foregroundcolor "yellow" -nonewline;
      Write-Host "k" -foregroundcolor "red" -nonewline;
      return "> ";  
    }
     
  3. Uruchamiamy ponownie PowerShella - powinien wystartować z nowym znakiem zachęty.

Przyspieszenie uruchamiania PowerShell'a

PowerShell w wersji 1.0 ma jedną wadę - wolno się uruchamia (tzn. o kilka sekund za długo) (w wersji 2.0 ten problem został już rozwiązany). Jest bardzo dobry sposób by to zmienić, wystarczy skompilować wszystkie jego moduły (z racji, że jest on napisany na (dot)NET'cie) do Native Image Cache.

Aby to zrobić (jeśli pierwszy raz uruchamiamy skrypty ze swojego komputera) należy zmienić politykę zabezpieczeń dotyczącą uruchamiania niepodpisanych skryptów. Robimy to w ten sposób: set-executionpolicy RemoteSigned ^ To gwarantuje, że będziemy mogli uruchomić własnoręcznie napisane, niepodpisane skrypty, ale już nie te niepodpisane, ściągnięte z Internetu. Tutaj jest więcej o polityce zabezpieczeń ( http://www.microsoft.com/poland/technet/article/art0107_01.mspx )

Dla systemów 64-bitowych należy uruchomić taki skrypt (zapisujemy go do pliku z rozszerzeniem .ps1 ):
Set-Alias ngen @( dir (join-path ${env:\windir} "Microsoft.NET\Framework64") ngen.exe -recurse | sort -descending lastwritetime )[0].fullName [appdomain]::currentdomain.getassemblies() | %{ngen $_.location}

Dla systemów 32-bitowych należy uruchomić taki skrypt (zapisujemy go do pliku z rozszerzeniem .ps1 ):
Set-Alias ngen @( dir (join-path ${env:\windir} "Microsoft.NET\Framework") ngen.exe -recurse | sort -descending lastwritetime )[0].fullName [appdomain]::currentdomain.getassemblies() | %{ngen $_.location}

Zakończenie

Mam nadzieję, że rozjaśniłem nieco sprawę z PowerShellem, pokazałem jak bardzo jest to przełomowy język i być może udało mi się przekonać kilka osób, że jest to przyszłościowe rozwiązanie. Widzicie jak to jest - w tym artykule miałem tylko przedstawić kilka moich skryptów, a wyszło jak zwykle ;) Mam nadzieję, że skorzystaliście troszeczkę. Więcej podobnych artykułów znajdziecie w moim serwisie www.lukas-home-page.ovh.org

Na zakończenie mam mały upominek dla Was mały upominek - bardzo pomocną dla początkujących ściągawkę z PowerShella: PowerShell - ściągawka

Użyteczne strony:
http://www.powershellpro.com/powershell-forum/ - Użyteczne skrypty posegregowane na kategorie

Źródła:

  1. Ściągawka z PowerShella, własne doświadczenia, dokumentacja Windows .NET ze strony MSDN

Łukasz "Lukas" Wyporek
lukas.home.page@gmail.com
http://lukashp.pl/Artykul/Programowanie/PowerShell_-_kilka_wskazowek 

 

Źródło: http://www.lukas-home-page.ovh.org/artykuly/PowerShell_-_kilka_wskazowek.php

Licencja: Creative Commons - bez utworów zależnych