PowerShell škola

poruka: 3
|
čitano: 18.204
|
moderatori: Lazarus Long, XXX-Man, vincimus
1
+/- sve poruke
ravni prikaz
starije poruke gore
15 godina
offline
PowerShell škola

Ovi tutorijali bi trebali biti malo drugačiji. Naime, na poslu se susrećem s PowerShellom, međutim, nisam nikada naučio jezik, ajmo reći, "prirodnim" putem, već samo one segmente koji mi trebaju, te već neko vrijeme sam sebe silim da primim knjigu u ruke i prođem jezik kako spada. Već sam jednom pokušao napraviti seriju tutorijala prije koju godinu, međutim, tada zbog nedostatka vremena je to bio fail biblijskih razmjera. Iskreno se nadam da će ovo biti ponešto drugačije.

Ukratko princip ovog topica bi bio - pričam Vama ono što ja trenutno učim. Neki plan je napisati novi mali tutorijal svakih 7-10 dana i na taj način i sebe prisiliti da polako savladavam gradimo, te u isti trenutak da vidim da li ću ja što kvalitetnije prolaziti kroz materiju ako moram naučeno odmah prezentirati Urbi et Orbi (dobro, ruku na srce mislim ipak mrvicu sporije ovdje prolaziti po PowerShellu jer ovi tutorijali bi bili namjenjeni potpunim početnicima).

 

No uglavnom,

PowerShell (skarećno PS), skriptni jezik kojim će se baviti ovi tutorijali, je Windowsov pandam Linuxovom bashu uz pokoju razliku, a najočitija je ona da PS (uglavnom) koristi objekte, dok bash radi na principu tekstualnih streamova.

Ja ću ove tutorijale pisati u PS 4.0, odnosno verzijom koja nativno dolazi sa Win 8.1, odnosno sa Win Server 2012(R2 ?). Za pisanje tutorijala koristi ću PowerShell ISE na Windows 8.1 (ili koji će već u to vrijeme biti up-to-date).

Ranije verzije PS-a i ranije verzije Winsa nisu podržane ovim tutorijalom, da se tako izrazim.

 

Da bi se pokrenuo PowerShell ISE, jednostavno se uđe u Start i upišite powershell. Windowsi bi trebali u desnom dijelu ekrana početi filtrirati što se nalazi na file systemu pod tim imenom, te na vrhu bi vam se trebala pokazati plava ikonica sa natpisom Windows PowerShell. Nakon pokretanja, dobiti će te plavi ekran sa specifičnim PSovim naredbenim retkom.

Da bismo ušli u PowerShell ISE, za sada, samo napišimo naredbu

Start-Process PowerShell ISE -Verb RunAs

 

Ako je sve u redu bilo napisano, pokrenuli ste Windows PowerShell Integrated Scripting Enviroment (od sada pa nadalje ISE) sa admin ovlastima.

Ako niste već mjenjali opcije u ISE-u, primjetit ćete tri sekcije u samom programu. Desni dio je add-on u kojem se nalazi popis svih, tvz. cmdlets (commandlets). U godnjem dijelu, bijeli dio, je područje za pisanje skripti. Ako ste do sada programirali u nekom IDE-u, taj dio shvatite tao PS-ov IDE. Donji, plavi, dio je interaktivno područje, odnosno naredbeni redak - dio koji radi na sličan (isti?) način kao i, recimo, Pythonov interpreter ili Linuxov shell ili Windowsov stari command prompt.

Za sada ćemo raditi isključivo u tom plavom, interaktivnom području, te možemo sakriti bijelo područje (očito, strogo tehnički nazivi) klikom na "strelicu" u gornjem desnom dijelu (bijelog područja, ne add-ona koji se nalazi na desnoj strani). Isto tako, ako vam je preglednije, možete i addon isključiti tako da ga ubijete na "x". Za ponovno uključivanje, opcije se nalaze u View izborniku (standardna alatna traka na vrhu).

 

No dobro, da za početak uopće objasnimo kako smo pokrenuli ISE.

Svaka naredba (cmdlets, ja ću koristiti za njih riječ - naredba) u PSu je oblika Verb-Noun, odnosno Glagol-Imenica. Naravno, ako programer (skripter?) dodaje svoje naredbe, one mogu biti u kojem god obliku on hoće, međutim, preporuča se upravo korištenje takve sintakse. Također, postoje podosta aliasa (drugo ime za naredbu, nadimak, u nastavku podrobnije objašnjenje) koji imaju sasvim dručaiji oblik zbog legacy razloga ili da bi se olakšao prijelaz sa basha ili kojih već god razloga.

Primjerice, Start-Process ima aliase "start" i "saps" po defaultu. Naravno korinisk može proširiti tu listu aliasa. Drugim riječim gornju naredbu za pokretanje ISE-a smo mogli napisati i

start PowerShell ISE -Verb RunAs

i

saps PowerShell ISE -Verb RunAs

i oba retka su u potpunosti istovjetna našem gornjem retku što se samih Windowsa tiče.

 

Nakon naredbe za pokretanje procesa upisali smo ime procesa koji želimo pokrenuti, te smo dodali switch Verb. Switchevi su dodatni argumenti koje prilažemo nekoj naredbi da bi izmjenili ili dopunili njeno izvršavanje. U ovome slučaju sa

-Verb RunAs

rekli smo da želimo pokrenuti process PowerShell ISE sa administratorskim ovlastima (istovjetno kao da smo napravili desni klik na .exe i odabrali Run As Administrator).

 

U redu, vratimo se našem samom ISE-u.

Vrlo vjerojatno redak u kojem možete pisati naredbe izgleda poput

PS C:\WINDOWS\system32>

Da bismo se pozicionirali u root (odnosno C:\), možemo upisati

cd /

Što je bilo kome tko se susreo sa CMD-om, poznata naredba. cd u PSu je alias za naredbu

Set-Location

Da bismo se uvjerili u to možemo napisati slijedeću naredbu

Set-Location C:\Windows\system32

Ponovno smo pozicionirani u system32 folder. Kada ste upisivali naredbu mogli ste primjetiti nešto kao "padajući izbornik" u kojem su bile izlistane naredbe. Ako ste ikada radili u Visaul Studio, to možete shvatiti kao neizrecivo primitivnu verziju IntelliSensa. Ukratko, kako pišete naredbe u ISE-u, on će vam, s obzirom što ste napisali, ponuditi opcije koje naredbe (ili putanja ili nešto treće) postoje sa napisanim slovima u sebi.

Pokušajmo se sada opet vratiti u root, ali na ovaj način

set-l [TAB] /Odnosno, napišite "set-l", pritisnite tipku "Tab", razmak, "/", enter. Jednom kada "padajući izbornik" (kojeg ćemo od sada pa nadalje zvati IntelliSense), označi (highlighta) naredbu, pritiskom na "Tab" (ili "Enter", ali enter nije dovoljno cool), ISE će (ili bilo koji drugi PS prozor, poput onoga iz kojega smo pokrenuli ISE) će dovršiti naredbu. Štoviše ako ponovno pritisnete Tab, on će početi vrtiti kroz sve naredbe koje odgovaraju vašim napisanim slovima (zato za korištenje IntelliSensa koristite Tab, a za izvršavanje naredbe Enter -> s Enterom se ne može vrtiti kroz IntelliSense).

 

Za sada bih skrenuo pažnju na još dvije PS naredbe - Get-Command i Get-Help

Ako upišemo u ISE

Get-Commandizlistati će nam se sve trenutno "prijavljene" (za sada nemoj razbijati glavu oko ovoga znaćenje, shvati AS-IS) naredbe.

Kako taj Get-Command učiniti ponešto upotrjebljivim. Recimo da želimo nešto napraviti sa nekim procesom, ali nismo ni sami sigurno kako bi to mogli napraviti sa PSom. Ono što možemo napraviti je zatražiti od PS-a da nam kaže koje sve naredbe trenutno može izvršiti a da u sebi sadrže riječ "process".

Get-Command *process*S gornjom naredbnom smo mu rekli - vrati mi sve naredbe koji u sebi sadrže niz znakova "process". Pimjetite zvijezdice na početku i kraju riječi process. One govore da očekujemo naredbe koje imaju nešto i prije i poslije (ali ne i nužno, odnosno da process može biti na samom kraju naredbe ili na samom početku naredbe) tog znakovnog niza. Ako bi htjeli ispisati sve naredbe koje striktno završavaju na niz "process", tada bi naredba izgledala ovako

Get-Command *processDrugim riječima, zvijezdica je wildcard koji kaže s koje strane očekujemo da bi se mogli pojavljivati neki znakovi pored našeg niza.

 

Recimo da smo izvršili jednu od gornjih naredbi i da nam je PS vratio nekoliko njih, te nas je zainteresirao Start-Process naredba, međutim, nismo sigurno kako bismo se poslužili tom naredbom. U pomoć nam može priskočiti Get-Help naredba, primjerice

Get-Help Start-Process -Examples

Gornja naredba će nam ispisati primjere korištenja naredbe Start-Process sa objašnjenjima. Moje mišljenje je da gornja naredba

Get-Help <ime naredbe> -Examples

za nekoga tko se uči PS, je daleko najkorisnija naredba koju netko može naučiti i definitivno preporuka je da svaki puta kada naiđete na novu naredbu sa Get-Help -Examples, pogledate što je ona u stanju izvesti.

 

Za početak to bi bilo to - kako pokrenuti ISE, kako koristiti IntelliSense, pojam aliasa i naredbe Get-Command i Get-Help. Čisto napomena, prije korištenja Get-Help naredbe, bilo bi poželjno napraviti Update helpa, sa

Update-Help

naredbom.

Također, ako želite biti sigurni da ste na istoj verziji PS kao i ja, možete provjeriti tako da u interaktivni redak upišete (ISE ili običan PS prozor)

$PSVersionTable

i provjerite piše li u retku PSVersion je vrijednost 4.0 (ili više). Ako imate stariju verziju, kako napraviti PS update, konzultirajte se sa Googleom. Nažalost, pošto nemam na raspolaganju računalo sa nekom starijom inačicom Winsa, ne mogu opisati postupak updatea. Iako, vjerujem da ako možete pokrenuti ISE u svom OSu (Win 7 ili novije), you are good to go.

You can patch technical vulnerabilities as they evolve, but there is no patch for stupidity, or rather gullibility. - Kevin Mitnick
Poruka je uređivana zadnji put ned 11.5.2014 15:46 (Bukva).
Moj PC  
3 0 hvala 4
15 godina
offline
Re: PowerShell škola
You can patch technical vulnerabilities as they evolve, but there is no patch for stupidity, or rather gullibility. - Kevin Mitnick
Poruka je uređivana zadnji put ned 1.6.2014 16:05 (Bukva).
15 godina
offline
Re: PowerShell škola

Jedan od važnijih koncepta koji susrećemo kod skriptnih jezika OS-ova (poptu PowerShella - PS) je pipelining (kako bi se točno to čudo trebalo prevesti, pojma nemam).

 

Pipelining je procesiranje ulančanih podatkovnih segmenata. Ako bi pribjegli nekoj vizualizaciji pipelininga, možemo zamisliti jednu industrijsku pokretnu traku u, recimo, tvornici automobila. Zamislimo da na početak te trake postavimo blok čelika, te taj čelik putuje po toj traci sve dok ne dođe do jedinice koja čisti i zagrijava taj čelik. Nakon te jedinice, zagrijani i čist čelik tom istom trakom putuje do nove jedinice koja će taj čelik izrezati u karoseriju. Slijedeća jedinica će karoseriju obojati u neku boju i tu završava put našeg bloka po toj alatnoj traci.

Ono što je važno uočiti je da se taj blok zavisno gdje se nalazio na traci (prije prve jedinice, prije druge jedinice, itd.) nalazio u određenom stanju (hladan blok, zagrijani blok, karoserija, itd), te da svaka ta jedinica je znala što da napravi upravo sa blokom u stanju u kojoj joj je došao. Da smo primjerice jedinici za bojanje donesli provobitni oblik bloka, ona ne bi znala kako obojati taj blok (jer očekuje karoseriju određenog oblika, a dobije kvadratni blok).

Kakve to veze ima sa PowerShellom?

 

Zamislimo slijedeću situaciju - želimo provjeriti koliko naš PowerShell prozor (shell) zauzima memorije. Da bismo izlistali sve procese koji su trenutno aktivni u operacijskom sustavu (OS), trebamo samo jednostavno napisati u PS-ov naredbeni redak slijedeću naredbu

Get-ProcessU pravilo, ova naredba bi nam trebala izlistati poveći broj procesa, te ručno tražiti naš process, (powershell_ise), nije baš najsretnije rješenje.

Ono što možemo napraviti je upotrijebiit pipelining da filtriramo rezultat, odnosno

Get-Process | Where-Object ProcessName -Like 'powershell*'Prva stvar koju ovdje trebamo primjetit je znak | (kombinacija Alt Gr, odnosno desna Alt tipka, i slova w) -> taj znak označava  pipelining. Odnosno taj znak možemo zamisliti kao trenutak kada čelični blok dolazi do nove jedinice (s time da ga nećemo upotrijebiti kada on dolazi do prve jedinice).

Što on zapravo radi? Taj znak output priješnje naredbe (Get-Process) proslijeđuje slijedećoj naredbi (Where-Object). U našem slučaju popis svih procesa prosljeđuje od Get-Processa prema Where-Objectu, koji nešto s tim popisom radi.

Where-Object naredba filtrira objekte (u našem slučaju taj objekt je, kako smo već rekli, popis svih procesa) prema nekome pravilu koji mu zadamo. Čisto da se prisjetimo od prošli puta - ako želimo o nekoj naredbi nešto više naučiti možemo jednostavno u PowerShell napisati slijedeće (primjer za Where-Object)

Get-Help -Name Where-Object

Filter koji smo mi upotrijebili je selektirao one retke u popisu čiji ProcessName atribut (kolona) počinje sa izrazom powershell. Odnosno, -Like switch naredbe Where-Object govori da tražimo nešto što sadrži nešto. U ovome slučaju tražimo ProcessName koji sadrži izraz powershell. Primjetite također da izraz završava sa znakom * (zvijezdica). Taj znak u ovome kontekstu se naziva wildcard, a označava na koju stranu izraza tražimo podatke. Pošto je wildcard na desnoj strani, mi smo rekli - traženi izraz započinje s powershell, a kako dalje ide, nismo točno sigurni.

Naravno, da smo htjeli naći sve objekte čiji ProcessName atribut (ili na engleskom property) završava sa powershell, tada bismo napisali slijedeću naredbu

Get-Process | Where-Object ProcessName -Like '*powershell'

Također, ukoliko powershell tražimo negdje "po sredini izrza" (ili jednostavno nismo sigurni na koju stranu se izraz nadovezuje na stvarnu vrijednost atributa), možemo zapisati na slijedeći način

Get-Process | Where-Object ProcessName -Like '*powershell*'

 

Ukratko, vratimo se na naš početni primjer (zvijezdica samo na kraju izraza). Ako smo sve u redu napisali, trebali bi dobiti nešto poput ovoga

Handles     NPM(K)   PM(K)     WS(K)  VM(M)    CPU(s) Id   ProcessName

    460      52       14       15     85        10.2   8   powershell_ise     Čisto napomena, donji brojevi će kod vas gotovo sigurno biti drugačiji.

 

Uglavnom, ovo nam previše ne govori koliko naš prozora zauzima memorije. U stvari i govori - koliko je zauzeće memorije govori stupac WS(K), odnosno WorkingSet(Kilo) -> zauzeće memorije u kilobajtima. WorkingSet atribut ne govori koliko trenutno zauzeće u RAM memoriji, već zauzeće svih memorijskih stranica (memory pages) procesa kojeg gledamo (trenutno što je točno WorkingSet nije bitno, shvatite to kao zauzeće memorije).

Naravno, da bismo samo ispisali podatak o zauzeću, možemo dalje pipelinati objekt (u ovome slučaju taj redak) i to sa naredbom

Select-ObjectSelect-Object selektira točno neki atribut koji želimo ispisati. Razlika između Where-Object i Select-Object je ta da je Where-Object filtrirao objekte (odnosno rekao, vrati mi sve objekte koji imaju to i to svojstvo), a Select-Object kaže vrati mi to i to svojstvo svih objekata.

To, jest, naša naredba će izgledati ovako

Get-Process | Where-Object ProcessName -Like 'powershell*' | Select-Object WorkingSet, ProcessNameMožemo primjetiti da WorkingSet je zapravo jedan jako veliki broj (odnosno nije zapisan u nama nekome prihvatljivom formatu).

Prije nego što krenemo rješiti taj zadnji problem, trebamo naučiti kako da selektiramo trenutnu varijablu u pipelineu (odnosno u našem slučaju process powerhsell_ise), a to možemo napraviti sa slijedećom sintaksom

$_Dolar znak ($) je općenito u PS-u znak za varijablu (u nekom od slijedećih tutorijala nešto više o tome), dok $ zajedno sa underscoreom (_), de facto znači ono što u C#, C++ ili nekom sličnom jeziku označavamo sa ključnom rjieči this (tj. selektiraj mi trenutni objekt).

Isto tako za sada zagrade { i } shvatite samo kao da na neki način odjeljuju kod unutar sebe od koda izvan sebe.

Odnosno naša naredba koja ispisuje memorijsku zauzeće procesa powershell_ise u megabajtima izgleda ovako

Get-Process | Where-Object ProcessName -Like '*powershell*' | Select-Object {$_.WorkingSet / 1mb }, ProcessNameNaravno $_.WorkingSet / 1mb znači da smo uzeli vrijednost atributa WorkingSet (trenutnog objekta) i podijelili ga sa jednim megabajtom, to jest, dobili njegovu vrijednost u megabajtima. Da bi PS znao da treba evaluirati (odnosno napraviti neki izračun) vrijednost WorkingSeta po principu da ga podijeli s 1mb, cijeli izrazom smo upisali unutar vitičastih zagrada.

You can patch technical vulnerabilities as they evolve, but there is no patch for stupidity, or rather gullibility. - Kevin Mitnick
Poruka je uređivana zadnji put ned 1.6.2014 20:47 (Bukva).
1
Nova poruka
E-mail:
Lozinka:
 
vrh stranice