Sve do sada napisano o alatu PowerShell odnosilo se na stariju verziju 5.1 kako je i demonstrirano. Budući da su korisnicima u međuvremenu postale dostupne novije verzije alata, u zadnjem nastavku serijala prvo ćemo razjasniti situacije oko različitih verzija PowerShella u praksi, a onda istaknuti najvažnije novosti u verziji 7.
Microsoft je 2016. godine objavio posve novu generaciju alata (PowerShell Code 6.0, a kasnije i 6.1 odnosno 6.2) namijenjenu različitim platformama – Windows, MacOS i Linux. Sve do verzije 6, PowerShellom se bilo moguće koristiti samo na vlastitom operativnom sustavu, to jest na nekoj od verzija Windowsa. Budući da je verzija 6 bila napravljena ispočetka na sasvim drugačijim osnovama od prethodnih verzija (NET Core), Microsoft je neko vrijeme usporedo razvijao obje generacije alata (5.x i 6.x).
Ove godine (nekoliko mjeseci nakon početka pisanja serijala o PowerShellu) pojavila se verzija 7 koja predstavlja zamjenu za obje prethodne generacije alata uz istovremenu podršku za različite operativne sustave. Službeno su podržani:
- Windows 7, 8.1 i 10
- Windows Server 2008 R2, 2012, 2012 R2, 2016 i 2019
- macOS 10.13+
- Red Hat Enterprise Linux (RHEL) / CentOS 7+
- Fedora 29+
- Debian 9+
- Ubuntu 16.04+
- openSUSE 15+
- Alpine Linux 3.8+
Neslužbeno uz pomoć zajednice korisnika podržani su i operativni sustavi Arch i Kali Linux.
Za bilo koji od nabrojenih operativnih sustava paket za instalaciju moguće je preuzeti s iste web-adrese: https://github.com/PowerShell/PowerShell. Na istoj adresi dostupan je izvorni kod alata, ako je to potrebno za vlastite dorade i izmjene.
Iako verzija 7.x predstavlja zamjenu za verziju 5.x, na istom Windows računalu mogu se istovremeno instalirati i koristiti obje verzije, kao što to pokazuje sljedeća slika. Zbog visokog stupnja kompatibilnosti sa starijom verzijom, postojeće skripte bi bez velikih prerada trebale normalno funkcionirati i u novoj verziji alata.
Provjeru trenutačno pokrenute verzije alata PowerShell moguće je napraviti pomoću naredbe:
Get-Host | Select-Object Version
Slika 1. Verzije 5.x i 7.x moguće je istovremeno instalirati i koristiti na istom računalu
Kompatibilnost u suprotnom smjeru (što je očekivano) nije uvijek moguća, kao što to pokazuje sljedeći primjer s novim parametrom naredbe -Parallel (o njemu detaljnije malo kasnije). Iako se na sljedećoj slici u obje verzije (5.x – lijevo i 7.x – desno) pojavljuju pogreške prilikom izvođenja, postoji bitna razlika. U verziji 5.x spomenuti parametar uopće nije dostupan, dok se u verziji 7.x može normalno koristiti, ali se greška pojavljuje zbog nedovoljnih prava na korištenje nekim od zadanih resursa.
Slika 2. Starija generacija PowerShella (5.x) ne može se koristiti svim mogućnostima verzije 7.x
Sad kad smo razjasnili priču oko verzija, istaknimo nekoliko najvažnijih unapređenja koje donosi verzija 7.x.
Već spomenuti parametar -Parallel (kojim se može koristiti u petlji ForEach-Object) omogućava paralelizam u radu, a samim tim i brže izvođenje dijelova petlje. Primjer (čiji su rezultati već prikazani na prethodnoj slici):
$logNames = 'Security','Application','System','Windows PowerShell','Microsoft-Windows-Store/Operational'
$logEntries = $logNames | ForEach-Object -Parallel {
Get-WinEvent -LogName $_ -MaxEvents 10000
} -ThrottleLimit 5
$logEntries.Count
omogućava istovremenu obradu različitih Log datoteka. Broj dijelova koda koji se istovremeno izvode u petlji može se odrediti pomoću parametra ThrottleLimit. U prethodnom primjeru pomoću varijable $_ označava se trenutačni dio koda koji se izvodi u dijelu skripte s podrškom za paralelno izvođenje programskog koda.
U samim skriptama podržano je nekoliko novih operatora (uobičajenih u drugim programskim jezicima), koji mogu znatno skratiti i pojednostaviti programski kod u samoj skripti. Prvi je skraćeni oblik pisanja provjere točnosti postavljenih uvjeta sa sintaksom po ugledu na C#.
<uvjet> ? <izvodi se ako je točan> : < izvodi se ako nije točan >
Na sljedećoj slici pokazano je kako se navedenim operatorom može koristiti kod provjere postojanja određene mape na disku, te ovisno o tome izvođenja različite operacije u nastavku skripte:
Slika 3. Provjera točnosti zadanog uvjeta na novi, skraćeni način
Novost u pisanju skripti su i operatori “&&” odnosno “||”, kojim se može koristiti kod povezivanja izvođenja naredbi u kanale. Prvi operator izvodi naredbu (koja predstavlja nastavak u kanalu naredbi) samo u slučaju kad je naredba na početku kanala ispravna, a drugi operator samo ako početak kanala nije ispravno izveden. Pravilnim korištenjem ovih dvaju operatora ponovo se može pojednostaviti programski kod i učiniti ga razumljivijim. Kako to izgleda u praksi može se vidjeti na sljedećoj slici:
Slika 4. Primjer korištenja operatorima “&&” i “||”
Za provjeru null vrijednosti također su uvedena dva nova operatora “??” i “??=”. Prvi operator vraća vrijednost s lijeve strane operatora samo u slučaju kad to nije null vrijednost. U protivnom vraća vrijednost izraza s desne strane. Drugi operator djeluje suprotno, te vraća vrijednost s desne strane operatora samo u slučaju kad je vrijednost izraza s lijeve strane jednaka null vrijednosti.
Zanimljivo je da postoji još nekoliko novih operatora, ali se oni trenutačno nalaze u takozvanoj eksperimentalnoj fazi. Zato je bolje da ih trenutačno ne koristite u vlastitim skriptama sve dok ne postanu službeno podržani.
Slika 5. Primjer korištenja operatorima “??” i “??=”
U verziji 7 unaprijeđen je i način prikaza pogrešaka, ako se one pojave tijekom izvođenja skripti. Tu se prije svega misli na potpuno nov način prikaza pogrešaka u slučajevima kad se pogreška treba prikazati na terminalima koji ne podržavaju boje. Ne zaboravite, PowerShell 7.x dostupan je na različitim verzijama Linuxa. U takvom okruženju bolje je koristiti se novim načinom pregleda ConciseView umjesto prije dostupnog NormalView. Po želji se trenutačno aktivni način prikaza može postaviti jednom od sljedećih dviju naredbi:
$ErrorView = 'NormalView'
$ErrorView = 'ConciseView'
Za dodatni (detaljniji) prikaz pogreški zadužena je također nova naredba Get‑Error. Kako izgleda dio podataka dobiven tom naredbom može se vidjeti na sljedećoj slici:
Slika 6. Primjer korištenja naredbom Get-Error
Od ostalih važnjih novosti spomenimo na kraju mogućnost upravljanja načinom prikaza obavijesti o dostupnosti novih verzija alata PowerShell. Dostupnost nove verzije alata provjerava se kod svakog prvog pokretanja alata PowerShell u razdoblju od 24 sata. Nastavak akcije nakon toga ovisi o vrijednosti sistemske varijable $Env:POWERSHELL_UPDATECHECK.
Na primjer, sljedeća naredba isključuje prikaz obavijesti o novim verzijama alata:
$Env:POWERSHELL_UPDATECHECK = 'Off'
Verzija 7 obuhvaća čitav niz ispravki naredbi poznatih otprije, unapređenja u mogućnostima korištenja dodatnim parametrima ili performansama izvođenja, pratećim uputama, ali nabrajanje svih tih detalja prelazi okvire ovog teksta. U svakom slučaju, verzija 7 predstavlja veliki korak naprijed koji nema smisla ignorirati, pogotovo ako se tijekom rada koristite drugim operativnim sustavima osim Windowsa, a željeli biste imati mogućnost korištenja istim (ili bar sličnim) skriptama na svim sustavima.