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
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 nieprompt
- je upravená funkcia PowerShellu, pokiaľ túto funkciu z profilu zmažete, PowerShell bude automaticky používať defaultný prompt funkciuGet-GitLog
- táto funkcia vracia log príkazugit
. Pokiaľ s touto utilitou nepracujete, môžete ju z profilu zmazať alebo nahradiť svoju vlastnú funkciígil
: alias pre funkciuGet-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:
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.