PowerShelli tulevikust

Eelmine kord rääkisime sellest, kuidas tuvastada keskkonda, milles skript jookseb.  Sealt jäi välja üks pisiasi: kuidas tuvastada Nano Server või Server Core keskkonda.

Server Core keskkonnaga on lihtne, seal on meil tavaline Powerhsell keskkond ja OS funktsioonidega kaasatulevad haldusmoodulid.  Vajadusel saab seda kontrollida:

$regPath = 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Server\ServerLevels\'

#Requires -Version 5.0
Get-ItemPropertyValue -Path $regPath -Name ServerCore

#Requires -Version 2.0
$RegKey = Get-ItemProperty -Path $regPath -EA SilentlyContinue
if ($RegKey."Server-Gui-Shell") {
  "Server with Desktop Experience"
} elseif ($RegKey.ServerCore) {
  "Server Core"
} elseif ($RegKey.NanoServer) {
  "Nano Server"
} else {
  "Not a Server OS"
}

Nano Server keskkonnaga on natuke raskem.  Nimelt on seal ruumi kokkuhoiuks OS funktsionaalsust vähendatud, sealhulgas .Net Framework on seal .Net Core, mitte täielik .Net Framework.  Ja kuna PowerShell sõltub .Net keskkonnast, siis on ka PowerShelli funktsionaalsus vähendatud.  Lisaks on puudu terve hunnik haldusmooduleid, mis tavaliselt olemas on.  Vähendatud funktsionaalsusega keskkond on tuntud kui PowerShell Core Edition:

#Requires -Version 5.1
$PSVersionTable.PSEdition

if ($PSVersionTable.PSEdition -like 'Core') {
  Write-Verbose 'Powershell Core'
} else {
  Write-Verbose 'Windows Powershell'
}

Natuke segadust võib tekitada see, et PowerShell v6 ajal pandi sellele nimeks PowerShell Core. Ja v7 nimetati jälle ümber (seekord lihtsalt PowerShell).

Skriptile võib lisada kontrolli, et vältida skripti käivitumist vales keskkonnas:

#Requires -Version 5.1
#Requires -PSEdition Core

Samuti on võimalik mooduli lisamisel/kasutamisel kontrollida, et see toetab keskkonda, kus teda kavatsetakse kasutada:

Find-Module -Tag PSEdition_Core

Get-Module -ListAvailable |
  Where-Object CompatiblePSEditions -Contains "Core"

Get-Module -ListAvailable | Where-Object {$_.CompatiblePSEditions}

Esialgu on moodulid ilma vajaliku infota manifestis, ent Windows 10 v1809/Server 2019 keskkonnas on OS-iga kaasatulevad moodulid juba ilusti märgistatud.  PowerShell Gallery moodulid on ka juba sildistatud või siis ei ole mooduli autor pidanud seda vajalikuks.

Pisike probleem selle märgistamisega on selles, et kui moodul peaks töötama ka varasemates PowerShelli versioonides, kui 5.1, siis ei saa CompatiblePSEditons tunnust lisada. Varasemad versioonid leiavad selle peale, et moodul on vigane ning ei lae seda. See on ka põhjus, miks Powershell Gallery soovitab lisada hoopis väljaande ja OS-põhised sildid. Nendesamade siltide järgi saab ka lokaalseid mooduleid filtreerida:

Get-Module -ListAvailable | Where-Object Tags -Contains 'Linux'

Get-Module -ListAvailable |
    Where-Object Tags -Contains 'PSEdition_Core'

Arvestades, et PowerShell 6 (ja 7) on juba olemas, tasub tähele panna:

  • Windows PowerShell 5.1 on viimane omast klassist ja seda edasi ei arendata.
    • Kõik Windows PowerShelliga seotud probleemid/ettepanekud tuleb raporteerida UserVoice saidis.  Vigade parandusi väidetavasti veel tehakse.
  • PowerShell on nüüd avatud lähtekoodiga projekt.  Seda ei panda Windowsiga kaasa, kuna seda arendatakse korraga mitmele platvormile: Windows, Linux, macOS.
  • PowerShell 6+ paigaldatakse Windows PowerShelli kõrvale ja see tuleb käivitada kui pwsh.exe
  • Kõik PowerShell 6/7-ga seotud probeemid/ettepanekud tuleb esitada Github saidis.
  • PowerShell 6+ ei sisalda enam järgmiseid asju:
    • Powershell ISE liides.  Arendustiim pakub alternatiivina kasutada Visual Studio Code redaktorit, mille Powershelli plugin on võimekam kui ISE.
    • Töövoogude (workflow) mootor.
  • Desired State Configuration saab samuti ümber kirjutatud .Net Core baasil (kunagi ehk).
  • PowerShell 2.0 režiimi ei ole enam v6+ sees. Samuti soovitatakse sellest v5+ peal lahti saada.

PowerShell 6+ kasutamisel on vaja tuvastada ka OS, mille peal joostakse.  Kuna CimCmdlets moodul pole veel komplektis, kui OS ei ole Windows, siis tuleb OS tuvastada teist moodi:

#Requires -Version 5.1
$PSVersionTable.PSEdition

#Requires -PSEdition Core
$PSVersionTable.OS

if ($PSVersionTable.PSEdition -like 'Core' ) {
    'PowerShell Core, OS: {0}' -f $PSVersionTable.OS
} else {
  "Windows PowerShell"
}

#Requires -Version 6
$IsWindows
$IsMacOs
$IsLinux

Kokkuvõtteks võib öelda, et tasub kõik oma skriptid/moodulid üle vaadata ning lisada vajalikud kontrollid, et vales keskkonnas oma töö asjaliku veateatega lõpetada. Ja lisada neile ka vajalikud sildid, et inimesed neid asjata alla ei tõmbaks.