IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

4. diel - PowerShell - Profily

V predchádzajúcej lekcii, PowerShell - Dátové typy a práce s objektmi , sme sa zoznámili s objektmi a základnými dátovými typmi.

V dnešnej lekcii kurze PowerShell frameworku sa zoznámime s profilmi.

Vytvorenie profilu

PowerShell profil nie je nič iné ako spustiteľný skript (s príponou .ps1), ktorý je v určitej lokácii. Tento skript sa spúšťa pred tým, než sa užívateľovi sprístupní session daného hosťa.

Aby sme mohli používať profily, je potrebné mať nastavenú ExecutionPolicy tak, aby PowerShell mohol spustiť .ps1 skript. Toto prevedieme príkazom Set-ExecutionPolicy AllSigned.

Táto lokácie je daná systémovú premennú $PROFILE:

C:\> $PROFILE
C:\Users\vojtech\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1

Profily sú rozdelené do 4 kategórií:

  • všetci užívatelia, všetci hostia (All users, all hosts) - profil aplikovaný na všetkých hostí (console, ISE) nezávisle na prihlásenom užívateľovi, cestu získame pomocou $PROFILE.AllUsersAllHosts
  • všetci užívatelia, konkrétne host (All users, current hosť) - profil aplikovaný na konkrétne hostí nezávisle na prihlásenom užívateľovi, cestu získame pomocou $PROFILE.AllUsersCurrentHost
  • konkrétny užívateľ, všetci hostia (Current user, all hosts) - profil aplikovaný na všetkých hostí pre konkrétneho užívateľa, cestu získame pomocou $PROFILE.CurrentUserAllHosts
  • konkrétny užívateľ, konkrétne host (Current user, current hosť) - profil aplikovaný na konkrétne hostí pre konkrétneho užívateľa, cestu získame pomocou $PROFILE.CurrentUserCurrentHost alebo len $PROFILE

Premenná $PROFILE vracia cestu, v ktorej očakáva daný skript profilu (aj v prípade, že profilový skript neexistuje).

V našom prípade budeme pracovať s variantom Current User, current hosť tak, aby sme neafektovali ostatných hostí, prípadne užívateľov používajúcich náš počítač.

Ako už bolo povedané, aj keď $PROFILE vráti cestu k profilu, táto cesta je len očakávaná a nemusí existovať. Najprv si teda zistíme, či tento profilový skript existuje, k tomu použijeme príkaz Test-Path:

C:\> Test-Path $PROFILE
False

V mojom prípade už profil existuje, teda môj výsledok by bol True. Predpokladám ale, že väčšina užívateľov začínajúcich s PowerShell tento profil zatiaľ nemá, preto by tam mala byť hodnota False. Profil vytvoríme ako inak, než opäť PowerShell príkazom New-Item:

C:\> New-Item $PROFILE
    Directory: C:\Users\vojtech\Documents\WindowsPowerShell


Mode                LastWriteTime               Length      Name
----                -------------               ------      ----
-a----              8/20/2020   5:49 PM         0           Microsoft.PowerShell_profile.ps1

Po tomto príkaze nám PowerShell vráti objekt práve vytvoreného súboru. Teraz máme profil vytvorený, ale je to iba prázdny skript, ktorý nič nerobí a je potrebné ho ešte len nakonfigurovať. Avšak si práve otestujeme ExecutionPolicy tak, že daného hosťa (napríklad konzolu) zatvoríme a spustíme znova. Ak nám všetko prebehlo bez chyby, všetko máme nachystané pre konfiguráciu nášho profilu.

V prípade, že sa nám objaví tento error, je potreba prepnúť ExecutionPolicy na buď Unrestricted alebo aspoň na AllSigned:

. : File C:\Users\vojtech\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1 cannot be loaded because running scripts is disabled on this system. For more information, see about_Execution_Policies
at https:/go.microsoft.com/fwlink/?LinkID=135170.
At line:1 char:3
+ . 'C:\Users\kasnyvoj\Documents\WindowsPowerShell\Microsoft.PowerShell ...
+   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : SecurityError: (:) [], PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess

Konfigurácia profilu

Teraz, keď máme profil vytvorený a PowerShell hosť je schopný tento profilový skript spustiť, ukážeme si, čo do profilu vlastne dať.

Čo do profilu dáme je len čisto na úvahe užívateľa, každopádne tu je niekoľko príkladov, čo by v profile mohlo byť a čo by určite nemalo byť.

Do profilu nepatrí:

  • manipulácia so systémovými premennými ako $ErrorActionPreference či $WarningPreference
  • REST alebo SOAP cally, prípadne iné API cally, ktoré sú závislé na kvalitné pripojenie k internetu
  • dlho bežiaci joby, ako napríklad dotazy do Active Directory
  • manipulácia s nastavením bezpečnosti PowerShellu, ako napríklad manipulácia s ExecutionPolicy
  • volanie externého skriptu, ktorý vyžaduje elevaci (Spustiť ako administrátor)
  • profil by nemal obsahovať žiadne statické reťazca, pokiaľ to nie je nutné (napríklad cesty k súborom)
  • umelo vynútené pozastavenie exekúcie profilu pomocou príkazu Start-Sleep
  • rekurzívne prechádzanie file systému
  • všeobecne nič, čo trvá veľmi dlho, pretože čím dlhšie trvá exekúcie profilu, tým dlhšie čaká užívateľ na sprístupnenie svojej Session Čo naopak do profilu určite patrí:
  • customizácia promptu (príklad + zdrojový kód nižšie)
  • aliasy, najmä ak používate externý utility ako napríklad git
  • vlastné funkcie prípadne triedy (ak sa jedná o viac funkcií, odporúča sa už použiť moduly, o tých si povieme v ďalších lekciách)
  • PsCustom objekty, napríklad ak chceme mať pri štarte PowerShell hosťa pripravený objekt s informáciami o našom počítači, stačí skopírovať kód z predošlej lekcie, kde sme si tvorili $ComputerInfo objekt
  • info pre užívateľov, napríklad v prípade použitia vlastných aliasov vypíšeme tieto aliasy do konzoly
  • ďalším nápadom sa určite medze nekladú, avšak je potrebné pamätať na to, čím viac kódu sa v profile púšťa, tým dlhšie môže užívateľ čakať na sprístupnenie session, čo môže mať nežiaduci efekt
PowerShell vie detekovať pomalé profily, load dlhšie ako 2 sekundy sa považuje za problémový. Ak PowerShell zistí pomalý load profilu, informuje nás touto správou:
Windows PowerShell
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.
Try the new cross-platform PowerShell https://aka.ms/pscore6

Loading personal and system profiles took 4575ms.
C:\>

Príklad profilu

Ako príklad profilu dávam k dispozícii jeden z mojich bežne používaných profilov (používam viac profilov, záleží na akom projekte zrovna pracujem). Čo sa v tomto profile nachádza (v profile je len nedeštruktívne kód):

  • 1 alias pre utilitu git. Pokiaľ s Gîte nepracujete, alias a funkciu môžete vynechať poprípade nahradiť podľa ľubovôle
  • 2 vlastné (custom) funkcia
  • customizácia prompt funkcie (prompt funkcia sa spúšťa vždy pri stlačení tlačidla Enter)

Profil otvorte vo svojom obľúbenom IDE či inom textovom editore (odporúčam Visual Studio Code s rozšírením pre PowerShell)

PowerShell vie automaticky otvoriť súbory podľa typu prípony v programe, ktorý má nastavený ako defaultný pre tieto typy prípon. Toto nastavenie sa vykonáva v nastavení Windows. Z PowerShellu nám stačí už potom zavolať príkaz Invoke-Item či jeho alias ii s cestou k súboru. Teda v prípade profile ii $PROFILE. Ak by sme zavolali Invoke-Item na cestu zložky, táto zložka sa nám otvorí v prieskumníkovi Windows

Do práve vytvoreného profilu Microsoft.PowerShell_profile.ps1 vložte nasledujúci kód:

function Test-Administrator {
    $currentPrincipal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent())
    $currentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
}

function prompt {
    $PsVersion = $host.version.ToString()
    switch (Test-Administrator){
        $true {
            $ID='admin'
        }
        default {
            $ID='user'
        }
    }
    Write-Host "[$PsVersion]" -ForegroundColor Cyan -nonewline
    Write-Host "[$env:USERNAME~$ID][$PWD]" -ForegroundColor DarkCyan -NoNewline
    Write-Output ' '
}

function Get-GitLog {
    param (
        [switch]$ShowFile,
        [switch]$PassThru
    )
    switch ($ShowFile){
        $true {$Attr = '--stat'}
        default {$Attr = $null}
    }
    switch ($PassThru){
        $true {
            git log --pretty=format:"%C(red)%ce%Creset,%Cblue%h%Creset,%C(bold cyan)%cd%Creset,%C(yellow)%s" | ForEach-Object {
                $LineArr = $_ -split ','
                $Hash = [ordered]@{
                    Commiter = $LineArr[0]
                    CommitHash = $LineArr[1]
                    CommitDate = $LineArr[2]
                    CommitMessage = $LineArr[3..$LineArr.Length] -join ','
                }
                New-Object psobject -Property $Hash
            }
        }
        default {git log --pretty=format:"%C(red)%ce%Creset committed %Cblue%h%Creset on %C(bold cyan)%cd%Creset with message %C(yellow)%s" $Attr}
    }
}
New-Alias -Name 'gil' -Value Get-GitLog

Opis custom funkcií a aliasu:

  • Test-Administrator - táto funkcia určí, či daná Session hosťa beží ako administrátor alebo nie
  • prompt - je upravená funkcia PowerShellu, pokiaľ túto funkciu z profilu zmažete, PowerShell bude automaticky používať defaultný prompt funkciu
  • Get-GitLog - táto funkcia vracia log príkazu git. Pokiaľ s touto utilitou nepracujete, môžete ju z profilu zmazať alebo nahradiť svoju vlastnú funkcií
  • gil: alias pre funkciu Get-GitLog

Teraz reštartujte PowerShell hosťa, naša prompt by mala vyzerať podobne (prompt je v skutočnosti kolorizována):

Windows PowerShell
[5.1.18362.752][vojtech~admin][C:\Dev\Repos]

Popis promptu:

  • [5.1.18362.752] - verzia PowerShell frameworku
  • [vojtech~admin] alebo [vojtech~user] - meno používateľa a identifikátor v akom režime je hosť spustený
  • [C:\Dev\Repos] - zložka v ktorej sa práve nachádzame

Ak pracujeme s git klientom (gitlab, github) a spustíme z daného repozitára alias gil, dostaneme podobný výstup tomuto:

PowerShell
Záverom len pripomeniem, že profil nie je nič iné ako spustiteľný PowerShell skript, pre ktoré musia byť povolená exekúcie, v opačnom prípade nás bude daný PowerShell hosť pri každom spustení vítať error.

V ďalšej lekcii, PowerShell - Moduly , sa zoznámime s PowerShell modulmi a tiež si jeden vytvoríme.


 

Predchádzajúci článok
PowerShell - Dátové typy a práce s objektmi
Všetky články v sekcii
PowerShell
Preskočiť článok
(neodporúčame)
PowerShell - Moduly
Článok pre vás napísal Vojtěch Kašný
Avatar
Užívateľské hodnotenie:
3 hlasov
Aktivity