Szkoła skryptowania – lvl 4 – skrypt „bazowy” i nowa wersja PowerShell


 

szkola_programowania_ikonaWitajcie ponownie miłośnicy automatyzacji zadań, tworzenia zawiłych algorytmów, oraz pisania skomplikowanych i zawiłych skryptów niezawierających żadnych komentarzy wyjaśniających ich działanie. Gdyby ktoś przeoczył (albo zapomniał – wszak dawno nie było „Szkoły skryptowania” na naszych łamach), to wszystkie odcinki są dostępne tutaj. W dzisiejszym odcinku natomiast chciałem przedstawić bardzo prosty sposób na to, aby nie było potrzebne za każdym razem wynajdywanie koła na nowo, oraz bardzo interesującą wiadomość (związaną ściśle ze skryptowaniem). Ale po kolei, oto dzisiejsze menu:

  1. konstrukcję prostego skryptu (PowerShell), który można szybko zaadoptować do różnych celów (głównie raportowych)
  2. wydanie kolejnej odsłony PowerShell
Skrypt „bazowy”

Podczas pisania skryptów pewnie zauważyliście, że kilka czynności jest bardzo powtarzalnych i jest tu miejsce na „skryptowanie skryptopisarstwa”, szczególnie jeśli chodzi o zadania dotyczące sporej liczby maszyn, które mamy już wypisane w pliku tekstowym „linijka pod linijką” (czyli po prostu mamy plik z nazwami maszyn lub ich adresami IP – lista_maszyn.txt). Dla zobrazowania plik powinien wyglądać mniej więcej tak:

MASZYNA01
MASZYNA02
MASZYNA03
MASZYNA04
MASZYNA*

Z pewnością nie raz spotkaliście z trywialnym zadaniem powiedzmy sprawdzeniu czy maszyny z danej listy są maszynami wirtualnymi, czy jednak fizycznymi (ot, taki sobie lekki i przyjemny przykład). Mamy już przygotowaną listę „n” maszyn, oraz zadanie do rozwiązania (oczywiście gdy mamy nadmiar czasu, możemy sobie sprawdzić wszystko ręcznie, ale to raczej sposób dla ludzi, którym proces twórczy jest obcy). Ja zazwyczaj zaczynam od uruchomienia sobie w moim ulubionym edytorze skryptu o nazwie: base.ps1 (o nim już za momencik). Jakie problemy możemy napotkać pisząc tak prosty skrypt? Oto kilka rzeczy, które jako pierwsze przyszły mi do głowy:

  • maszyna z listy jest niedostępna w sieci
  • nie mamy uprawnień do wykonywania działań na zdalnej maszynie
  • na maszynie nie jest dostępny serwis do wykonywania zdalnych działań (RPC)
  • używamy w skrypcie jakiejś zmiennej, która jest już zarezerwowana, lub wykorzystana
  • skrypt zatrzyma się w pętli gdy napotka jakiś niestandardowy błąd

Dzięki możliwościom PowerShella, jesteśmy sobie w stanie dość szybko poradzić z tymi problemami i wyeliminować je ze wszystkich naszych przyszłych skryptów :), ale po kolei.
Moja propozycja skryptu „bazowego” zawiera na wstępie bardzo proste instrukcje odpowiadające za: czyszczenie ekranu, czyszczenie „przestrzeni zmiennych”, ustawienie „przestrzeni wykonywania” skryptu oraz między innymi zapobiegnięcie „wyłożeniu” się skryptu w pętli, a to wszystko ledwie w kilku linijkach :) i tak skrypt rozpoczyna się od następujących poleceń:

Clear
$ErrorActionPreference = ‚silentlycontinue’
Remove-Variable [a..z]* -Scope Global
Remove-Variable [1..9]* -Scope Global
$ScriptPath = $MyInvocation.MyCommand.Path
$Dir = Split-Path $ScriptPath
Push-Location $Dir

Pierwsza linijka chyba nie wymaga komentarza ;), druga odpowiada za brak wyświetlania błędów oraz zakończeniu skryptu przed czasem (szerzej o ErrorActionPreference możesz poczytać tutaj. Dwie kolejne linie odpowiadają za usunięcie z pamięci nieużywanych w danym momencie zmiennych, ostatnie przy z powyższych „ustawiają” przestrzeń wykonywania na folder, gdzie zapisany jest skrypt (to pozwala między innymi na trzymanie pliku z listą maszyn w tym samym folderze oraz ewentualne zapisanie wyników skryptu w tym samym miejscu – nie ma też potrzeby podawania pełnych ścieżek do tych plików w skrypcie, co jest bardzo wygodne).
W dalszej części skryptu potrzebne jest sprawdzenie, czy maszyna jest on-line, oraz czy akceptuje żądania RPC. Do tego celu użyjemy nieco metod z Windows API (tak mi się wydaje :) ).

$ping = new-object System.Net.NetworkInformation.Ping
$tcp = New-Object System.Net.Sockets.TcpClient($ip,$port)

Proste prawda? Czy już chodzi Wam po głowie PowerShellowy skaner portów? Spokojnie pewnie do tego wrócimy ;) Skoncentrujmy się teraz na zbudowaniu skryptu-wzorca. Chociaż w sumie… to już koniec. Jak jednak przekształcić te kilka linijek w użyteczny automat do przeczesywania listy maszyn? Poniżej kompletny „listing” skryptu sprawdzającego czy maszyna zdalna jest maszyną wirtualną czy fizyczną:

Clear
$ErrorActionPreference= 'silentlycontinue'
Remove-Variable [a..z]* -Scope Global
Remove-Variable [1..9]* -Scope Global 
$ScriptPath = $MyInvocation.MyCommand.Path
$Dir = Split-Path $ScriptPath
Push-Location $Dir
$port = "135"
$MachinesList = Get-Content 'lista_maszyn.txt'
foreach ($Name in $MachinesList)
{
 $rslt = $null
 $tcp = $null
 $ping = new-object System.Net.NetworkInformation.Ping
 $rslt = $ping.send($Name)
 if ($rslt.status.tostring() -eq "Success")
 {
  try
   {
    $tcp=New-Object System.Net.Sockets.TcpClient($ip,$port)
   }
  catch
  {
  }
   if($tcp.client.connected)
   {
    $Name + " On-Line & RPC is OK"
    Get-WmiObject -Class Win32_ComputerSystem -ComputerName $Name |Select-Object -Property Manufacturer
    Write-Host "---------------------------------------------------------------"
   }
   else
   {
    $Name + " On-Line & RPC is NOT OK"
   }
  }
Pop-Location
Powershell 4 – już jest

Microsoft nie próżnuje i już jakiś czas temu wydał nową wersję (oznaczoną numerem 4). Zachęcam gorąco do aktualizacji, należy jednak pamiętać o tym, że wymagana jest wcześniejsza wersja PowerShell.
Zaglądajcie na nasz blog częściej i wypatrujcie kolejnego odcinka!

Seria „Szkoła skryptowania” zawiera:
Repozytorium skryptów
Narzędzia
U źródeł, czyli literatura i przydatne linki
Perl w Windows
Skrypt „bazowy” i nowa wersja PowerShell


Podobne Tematy:

  • Szkoda że artykuł nie jest uzupełniony o indeks pozostałych artykułów z cyklu. Dotyczy też poprzednich.

    • jeszcze jedno. po co robicie URL do pokazania małego obrazka, skoro i tak nie widać nic więcej? bez sensu.

    • Dariusz Góra

      celna uwaga, spis treści dodany

      • Dzięki, o to chodziło :) Za to obrazek z ręką przy „tablicy”, nadal wskazuje na obrazek tej samej wielkości. po co on jest linkowany?
        Generalnie, bardzo fajny cykl. Dziwi mnie mała ilość komentarzy.

        • Łukasz Skalikow

          To też celna uwaga. Poprawione. Staramy się unikać zbędnych linków – postaramy się bardziej pilnować :)