PowerShell
Fundamental PowerShell istifadəsi
Windows PowerShell, İT mütəxəssislərinin sistemləri konfiqurasiya etməsinə və adminstrativ tapşırıqları avtomatlaşdırmasına kömək etmək üçün hazırlanmış, interaktiv terminala sahib skript dilidir. Windows 2008 R2 ilə başlayan hər müasir Windows ƏS-də standart olaraq qurulub.
PowerShelldən həm terminal kimi əmrləri tək tək yazmaq həm də ISE (Integrated Scripting Environment) olaraq öz skriptlərimizi hazırlamaq üçün istifadə edə bilərik. Hər ikisini çalışdırmaq üçün sadəcə start menusunda adlarını axtara bilərsiniz.


PowerShell Scriptlərini çalıştırmaq
PowerShell skriptləri .ps1 fayllarında saxlanılır. Skripti sadəcə üzərinə 2 dəfə klik etməklə çalışdıra bilməzsiniz, sisteminizə bilmədən zərər verməyinizin qarşısını almaq üçün bu cür dizayn edilib. Bir skripti çalışdırmaq üçün əvvəlcə sağ klik etmək və sonra açılan menudan “PowerShell ilə Çalıştır” (Run with PowerShell) düyməsini basmaq lazımdır.
Windowsda bir policy var ki, bu policy sistemdə .ps1 fayllarının icrasına icazə verilib verilməməsini müəyyənləşdirir. Bu policy ExecutionPolicy adlanır. Sistemimizdə hazırda icazə verilib verilməməsini bilmək üçün PowerShell terminal pəncərəsində aşağıdakı əmri çalışdırırıq:
Göründüyü kimi ExecutionPolicy hazırda Restricted dəyərini verir. "Restricted" sözü ingiliscədən tərcümədə "məhdudiyyət qoyulub" mənasını verir. ExecutionPolicy həmçinin aşağıdakı dəyərləri ala bilər:
Restricted - Heç bir skriptə icazə verilmir. Standart olaraq belə olur.
AllSigned - Yalnız güvənilən developerlər tərəfindən imzalanan skriptlərinin çalışdırılmasına icazə verilir.
RemoteSigned - Həm sizin skriptlərinizin, həm də güvənilən developerlər tərəfindən imzalanan skriptlərinin çalışdırılmasına icazə verilir.
Unrestricted - Bütün növ skriptlərə icazə verilir.
Sistemimizdə .ps1 skirptlərini çalışdıra bilmək üçün aşağıdakı əmri istifadə edirik və öz skriptlərimiz çalışsın deyə ExecutionPolicy dəyərini RemoteSigned edirik:
Əmr: Set-ExecutionPolicy RemoteSigned
Yuxardakı hissəni bir az sağa sürüşdürsəniz görəcəksiniz ki, bizdən bunu təsdiq etməyimizi istəyir, belə olan halda "Y" (yəni yes) yazıb enter sıxırıq.
Ola bilər ki sizə Permission Denied xətası versin, belə olan halda powershell terminaını Administrator adı ilə başladmaq lazımdır.
Fikir verdinizsə bir məlumatı görmək istədiyimiz əmr "Get" ilə başladı, onu dəyişdirmək üçün istifadə etdiyimiz əmr isə "Set"ilə başladı. İndi isə bu qanuna uyğunluq barədə öyrənək.
Sadə əmrlər
Linuxda olan ls, pwd, cd, mkdir, echo, cat, ps və s. burada da eyni məqsədlə çalışır.
Cmdlet-lər
Cmdlet əvvəlcədən təyin edilmiş funksiyaya malik olan bir PowerShell əmrinə deyilir. Programlaşdırma dillərində olan operatorlar kimi. Cmdletlər haqqında aşağıdakıları bilməlisiniz:
Cmdletlərin 3 növü var: System, User və Custom
Cmdletlər nəticələri terminala ya array ya da object olaraq qaytarır (Programlaşdırma dillərindən öyrəndiyimiz array və object).
Cmdletlər datanı həm terminalda göstərə həmçinin başqa bir Cmdlet-ə ötürə bilər(Linuxda olan piping burada da var.)
Cmdletləri yazarkən hansı hərfi böyük hansını kiçik yazdığınızın əhəmiyyəti olmur. Yuxarıda olan əmri SeT-ExeCuTionPolicY formasında yazsaq da işləyəcək yenə.
Əgər ardıcıl olaraq bir neçə Cmdlet işlətmək istəyiriksə onları
;işarəsi ilə ayıraraq ardıcıl yazmalıyıq.
Cmdletlərin formaları
Cmdletlər adətən bir feil və bir ismin birləşməsindən yaranır. Qısaca məntiqi "Filan şeyi et, filan obyektə et". Aşağıda bu feillərdən bəzilərini görə bilərsiniz:
• Get - Hansısa datanı əldə etmək üçün. Yuxarıda işlətdik. • Set - Hansısa parametrin dəyərini dəyişmək üçün. Yuxarıda işlətdik. • Start - Nəyisə çalışdırmaq üçün • Stop - Çalışan nəyisə dayandırmaq üçün. • Out - Hansısa datanı terminala output edilməsini təmin etmək. • New - Yeni bir şey yaratmaq üçün. (Bu feil deyil, lakin Cmdletlər belə də başlaya bilir.)
Test etmək üçün gəlin sistemimizdəki servisləri görək:
Yuxarıdakı cmdlet bizə servislərin adını, hazırki vəziyyətlərini və qısa izahlarını gətirdi. Aşağıdakı əmr isə sistemimizdə çalışan prosesləri Bizə göstərir:
Hansısa cmdletin necə istifadə edildiyini öyrənmək üçün Get-Help cmdletini istifadə edə bilərsiniz. Məsələn Get-Process cmdleti barədə yardım alaq:
Alias-lar
20-ci sətirdə gördüyünüz ALIASES hissəsində həmin əmrin qısa adı görünür. Yəni biz Get-Process cmdletini sadəcə ps və ya gps yazaraq icra edə bilərik.
Parametrlər
Parametrlər icra olunacaq olan cmdlet-in nəyə əsasən icra olunacağını təmin edən dəyərlərdir. Məsələn biz axtarmaq əmri verdiyimiz zaman hansısa açar söz əlavə edirik ki həmin sözü axtarsın. Həmin bu açar söz indiki vəziyyətdə parametr olaraq çıxış edir. İcra olunan program və ya cmdlet öz işini həmin açar sözü tapmaq üçün həyata keçirir. Hər cmdletin özünə uyğun parametrləri var ki cmdletləri daha çox istifadəyə yararlı hala gətirir. Əgər hansısa əmri PowerShell ISE də yazsaq o avtomatik olaraq cmdletin özünə məxsus olan parametrləri təklif edəcək, digər kod editorlarında və ya İDE-lərdə olduğu kimi.

Parametr adları cmdletdən sonra əvvəlində tire(-) qoyulmaqla yazılır. Məsələn bizə Servislərdən yalnız Xbox servislərini görmək lazımdır. Belə olan halda Get-Services əmrini və onun -Name parametrini istifadə edəcəyik. Aşağıdakı əmrdə olduğu kimi:
Ulduz işarəsi wildcard olaraq çıxış edir. Və adının əvvəlində Xbox ifadəsi olan bütün servisləri gətirir.
Yeri gəlmişkən
Wildcard bir və ya bir neçə simvolu əvəz etmək üçün istifadə olunan simvoldur. Müxtəlif dillərdə müxtəlif simvollarla ifadə edilə bilər( Misal üçün burada ulduz olsa da MySQL-də wildcard olaraq "%" simvolu istifadə olunur). Məsələn biz "Kam*" ifadəsini axtarış etsək belə olan halda Kamal, Kamil, Kamança və sair kimi "Kam" ilə başlayan nəticələr görünəcək.
Əgər biz "*can" ifadəsinə görə axtarış etsək nəticələrdə Azərbaycan, Elcan, Fincan və s. nəticələr görəcəyik. Qısaca "can" ilə bitən hər hansı ifadə.
Əgər biz "*iyya*" ifadəsi ilə axtarsaq bu zaman Riyaziyyat, Mənəviyyat, Ədəbiyyat və s. kimi əvvəli və sonu necə bitdiyindən aslı olmayaraq ortasında "iyya" ifadəsi olan nəticələr görünəcək.
İndi əsas mövzuya qayıdaq ...
Yuxarıda qeyd etdiyimiz -Name parametri sadəcə bir parametr idi. Onun kimi çox sayda işimizi asanlaşdıracaq parametrlər var. Hansısa bir cmdletin imkanlarından xəbərimiz yoxdursa və mövcud parametrlərini görmək istəyiriksə belə olan halda piping ( | ) istifadə edərək Get-Member cmdletini istifadə edə bilərik. Get-Member cmdleti özündən əvvəl yazılan cmdletin parametrlərini göstərir. Aşağıdakı kimi:
Gördüyümüz kimi Get-Service cmdletinin bütün parametrlərini terminalda göstərdi. Bu parametrlərə əsasən Get-Service cmdletinin bizə verəcəyi məlumatları istədiyimizə uyğun formalaşdıra bilirik.
Piping (qoşmaq) ilə daha dəqiq əmrlər
İndi isə piping istifadə edərək əvvəlcə bütün servisləri görüb sonra onların arasından yalnız istifadə olunanları çıxaracağıq. Lakin bu datanı da tam yox, yalnız adlarını göstərəcəyik. Bunu etmək üçün 3 cmdlet-i bir birinə qoşmaq lazımdır:
• Get-Service - bütün servisləri çəkmək üçün.
• WHERE {$_.status -eq "Running"} - WHERE (burada: Harada ki...) ifadəsi bütün datanın arasında yalnız özündən sonrakı hissədə tətbiq edilən filterə uyğun gələn dataları seçir.Programlaşdırma təcrübəsi olanlar üçün qısaca: bir cmdletin return etdiyi data ikinciyə $_ adı ilə ötürülür.Daha uzun: $_ - hissəsi hazırki cmdletdən əvvəl gələn cmdlet tərəfindən ötürülmüş datanı bildirir. Yəni ilk cmdletimiz olan Get-Service cmdletinin gətirdiyi bütün servislərin siyahısı ikinci cmdletə ötürərkən $_ olaraq adlandılır ki, lazım olarsa qısa bir adla bütün datanın üzərində əməliyyat aparmaq mümkün olsun. Beləliklə də $_.status -eq "Running" hissəsi bütün data içərisində statusu Running ə bərabər olan (-eq = equals = bərabərdir) servislərə məxsus bütün datanı gətirir.
• SELECT displayname hissəsi bizim üçün əmrimizin 1 və 2 ci hissələrindən filterlənmiş bütün data içərisində yalnız displayname-ləri seçir. Yəni istifadəçilərə göstərilən adlarını. Bununla da daha səliqəli data əldə etmiş oluruq.
Aşağıdakı kimi:
İndi qoşmalarımızın sayını daha çox artıraq və aldığımız nəticəni fayla yazaq. Bunun üçün Out-File cmdleti işlənir və əmrimiz aşağıdakı kimi dəyişir:
Get-Service | WHERE {$_.status -eq "Running"} | SELECT displayname | Out-File C:\serv.txt
Aydın olduğu kimi yuxarıdakı 4-cü pipe olunan əmr ona göndərilmiş 1, 2 və 3cü əmrdən keçib gələn datanı C diskində serv.txt adı ilə yaddaşa yazacaq (Əgər icazəniz varsa, əks halda "Access Denied!").
Əksər cmdletlərin Azərbaycan dilində izahı
Buradan keçid edərək baxa bilərsiniz.
Daha geniş:
1. https://docs.microsoft.com/en-us/powershell/scripting/samples/sample-scripts-for-administration?view=powershell-7.1 2. https://www.tutorialspoint.com/powershell/powershell_operators.htm 3. https://www.johndcook.com/blog/powershellcookbook/
Last updated