Na co dzień administruję zarówno systemami Windows Server jak i Linux, w obu przypadkach często wspieram się skryptami, które piszę do różnych potrzeb. W przypadku Linuxa proste skrypty programuję w Bash korzystając z gotowych poleceń i funkcji typu awk, sort, uniq, xargs itp… W Windows Server oczywiście posługuję się PowerShell.
Jeszcze parę lat temu by ułatwiać sobie pracę w Windows obowiązkowym narzędziem był Cygwin – który dodawał do Windows zestaw poleceń znanych z Linux.
Obecnie sytuacja się odwraca… brakuje mi PowerShell w Linux. Zdrajca pomyślicie… cóż, Bash w Linux jest świetny, a jeszcze programowanie w VI – po prostu master 🙂
Ale …
Ale PowerShell naprawdę jest lepszy… jego składnia jest uporządkowana, jest w zasadzie C-podobny, ma wygodny edytor (ISE).
Przykład – aktualizowałem dziś jeden z serwerów, na którym musiałem usunąć kilkanaście plików, z różnych lokalizacji. W Bash wyglądało to mniej więcej tak:
> find / -type f -name "*.bak" -exec rm -f {} \;
Natomiast w PowerShell wygląda to tak:
PS C:> Get-ChildItem -Path C:\ -Filter *.bat -Recurse | Remove-Item
Procedura w PowerShell korzysta z funkcji, których nazwy łatwo zapamiętać (są one logiczne), zaś konstrukcja jest zawsze taka sama – pierwsza funkcja w tym przypadku zwróciła zbiór elementów (obiektów, które zawierają wszystkie dane dotyczące znalezionych plików), druga zaś usunęła pliki na podstawie zawartości elementu.
W Linux w tym przypadku otrzymaliśmy również zbiór ale ścieżek do plików i poprzez -exec usunęliśmy je.
Inny przykład. Chcemy jednym poleceniem pobrać listę rekordów typu A dla wybranej domeny, niech to będzie blog.polewiak.pl
W przypadku Bash mamy oczywiście polecenie:
> host -t A blog.polewiak.pl
Sęk w tym, że wynik polecenia wygląda mniej więcej tak:
blog.polewiak.pl has address 104.28.6.55 blog.polewiak.pl has address 104.28.7.55
Aby zatem „wyciągnąć” z tego adresy IP trzeba się posłużyć jakąś funkcją, która przetworzy ten ciąg znaków – np: cut
> host -t a blog.polewiak.pl | cut -d' ' -f 4
Podzieliliśmy wcześniejszy ciąg znaków na części wykorzystując znak spacji jako „dzielnik”, następnie zwróciliśmy element z pozycji 4-tej…
Sytuacja się skomplikuje jeśli wynik polecenia host ulegnie zmianie. To ważne, bo w Linux za każde polecenie czy to systemowe czy z dodatkowych modułów może odpowiadać inna osoba, więc istnieje ryzyko, że nasza funkcja nie zawsze będzie zwracać takie same wyniki…
A jak to wygląda w PowerShell. W PowerShell funkcje na ogół zwracają obiekty lub tablice obiektów. Każdy z obiektów ma z góry określone elementy, które można łatwo pobrać po nazwie.
PS C:> Resolve-DnsName blog.polewiak.pl -Type A
zwróci nam:
Name Type TTL Section IPAddress ---- ---- --- ------- --------- blog.polewiak.pl A 299 Answer 104.28.6.55 blog.polewiak.pl A 299 Answer 104.28.7.55
To są dwa obiekty z polami o nazwach Name, Type, TTL, Section, IPAddress
Jeśli chcemy w wyniku posiadać tylko adresy IP – jak w analogicznym przykładzie z Linux to wywołamy polecenie:
PS C:> (Resolve-DnsName blog.polewiak.pl -Type A).IPAddress
To nic innego jak wyświetlenie dla każdego z obiektów tylko elementu o nazwie IPAddress
Podsumowując
Plusy PowerShell:
- przewidywalna konstrukcja poleceń
- nazwy poleceń zawsze składają się z dwóch członów – operacji jaką wykonujemy (Get, Set, Add, Test), oraz typu danych na których wykonujemy operację.
- Funkcje zwracają obiekty, które łatwo interpretować – bez potrzeby przetwarzania ciągu znaków
Minusy:
- Brak kompatybilności wstecznej – skrypty pisane w środowisku Windows 8/Windows Server 2012 mogą nie działać na starszych systemach
- Nie ma wersji dla Linux (jest port http://pash.sourceforge.net/), i raczej nie będzie, bowiem PS jest mocno zintegrowany z systemem operacyjnym (WMI, .Net itp)
Jeśli masz jakieś pytania odnośnie PowerShell – odezwij się, czekam na Wasze komentarze i opinie.
A co byś proponował dla „domowego” informatyka? Znam podstawy Pythona, bardzo interesuję się relacyjnymi bazami danych, używam Excela, chciałbym wykorzystywać hurtowe ładowanie danych z/do Excela i z /do baz danych, czasami wykonuję jakieś operacje na kilkunastu plikach, itp. Niektóre z tych rzeczy wykonuję w pracy zawodowej (biuro). Na podstawie tego co napisałem powyżej, czy dla takiego przeciętnego pseudo-informatyka jak ja, bardziej przydatna będzie nauka Basha czy PowerShella?
Obecnie – stawiałbym na PowerShell jako język skryptowy do zarządzania usługami. Bo pamiętaj, że to język programowania głównie przydatny do administracji usługami.
PowerShell może zarządzać Windows Server, Windows Desktop jak również Azure.
Rozumiem. Dzięki za wyjaśnienie.