A PSScriptAnalyzer, hogy ellenőrizze PowerShell verzió kompatibilitás
PSScriptAnalyzer verzió 1.18 megjelent a közelmúltban, és a hajók erős új szabályok, amelyek ellenőrzik PowerShell szkriptek inkompatibilitás más PowerShell verziók és környezetekben.
ebben a blogbejegyzésben, az első a sorozatban, látni fogjuk, hogyan kell használni ezeket az új szabályokat, hogy ellenőrizze a script futó problémák PowerShell 3, 5.1 és 6.
Várj, mi a PSScriptAnalyzer?,
a PSScriptAnalzyer egy modul, amely statikus analízist (vagy lintelést), valamint néhány dinamikus elemzést (a környezet állapota alapján) biztosít a PowerShell számára. Ez képes megtalálni a problémákat, és kijavítani a rossz szokások PowerShell szkriptek, mint létrehozni őket, hasonlóan ahhoz, ahogy a C# fordító kapsz figyelmeztetések és hibákat talál C# kódot, mielőtt végrehajtja.,
Ha a VSCode PowerShell kiterjesztését, lehet, hogy láttam a “zöld értékeket” probléma jelentések PSScriptAnalyzer generál a parancsfájlok szerző:
telepítheti PSScriptAnalyzer, hogy használja a saját parancsfájlok:
Install-Module PSScriptAnalyzer -Scope CurrentUser
PSScriptAnalyzer működik, fut egy sorozat szabályok a parancsfájlok, amelyek mindegyike egymástól függetlenül értékeli néhány kérdés., Például a AvoidUsingCmdletAliases
ellenőrzi, hogy az álneveket nem használják-e a szkriptekben, és a MisleadingBackticks
ellenőrzi, hogy a sorok végén lévő háttértáblákat nem követi-e a szóköz.
további információért lásd a PSScriptAnalyzer mély merülés blog sorozat.
A kompatibilitási ellenőrzési szabályok bevezetése
az új kompatibilitási ellenőrzési funkciót három új szabály biztosítja:
- PSUseCompatibleSyntax, amely ellenőrzi, hogy a szkriptben használt szintaxis más PowerShell verziókban is működni fog-e.,
- PSUseCompatibleCommands, amely ellenőrzi, hogy a parancsfájlban használt parancsok elérhetők-e más PowerShell környezetben.
- PSUseCompatibleTypes, amely ellenőrzi, hogy a. net típusok és a statikus módszerek / tulajdonságok elérhetők-e más PowerShell környezetben.
a szintaxisellenőrzési szabály egyszerűen megköveteli a célozni kívánt PowerShell verziók listáját, és megmondja, hogy a szkriptben használt szintaxis nem fog-e működni ezen verziók egyikében sem.,
a parancs-és típusellenőrzési szabályok kifinomultabbak, és a gyakran használt PowerShell platformok profiljaira (elérhető parancsok és típusok katalógusaira) támaszkodnak. Konfigurációra van szükségük ezeknek a profiloknak a használatához, amelyeket az alábbiakban ismertetünk.
ehhez a bejegyzéshez megvizsgáljuk a PSUseCompatibleSyntax és PSUseCompatibleCommands konfigurálását és használatát annak ellenőrzésére, hogy egy szkript működik-e a PowerShell különböző verzióival. Nézzük PSUseCompatibleTypes egy későbbi bejegyzésben, bár úgy van beállítva, nagyon hasonlóan PSUseCompatibleCommands.,
Dolgozik példa: egy kis PowerShell script
Képzeld el, van egy kis (s mesterkélt) levéltári script mentette meg, hogy a .\archiveScript.ps1
:
Ez a forgatókönyv volt írva a PowerShell 6.2, valamint vizsgáltuk, hogy ott dolgozik. De más gépeken is szeretnénk futtatni, amelyek közül néhány a PowerShell 5.1-et, néhány pedig a PowerShell 3.0-t futtatja.
ideális esetben teszteljük azokat a többi platformon, de jó lenne, ha megpróbálnánk minél több hibát kijavítani az idő előtt.,
szintaxis ellenőrzése PSUseCompatibleSyntax
Az első és legegyszerűbb szabály a PSUseCompatibleSyntax. Létrehozunk néhány beállítást a PSScriptAnalyzer számára a szabály engedélyezéséhez, majd futtatjuk az elemzést a szkriptünkön, hogy visszaállítsuk a kompatibilitással kapcsolatos diagnosztikát.
A Psscriptanalyzer futtatása egyszerű., Jön, mint egy PowerShell modul, így ha ez telepítve van a modul útvonal csak hivatkozhat rá a fájl Invoke-ScriptAnalyzer
, mint ez:
Invoke-ScriptAnalyzer -Path ".\archiveScript.ps1`
egy nagyon egyszerű meghívás, mint ez fog futni PSScriptAnalyzer az alapértelmezett szabályok és konfigurációk a script pont azt.
mivel azonban célzottabb konfigurációt igényelnek, a kompatibilitási szabályok alapértelmezés szerint nem engedélyezettek. Ehelyett meg kell adnunk néhány beállítást a szintaxisellenőrzési szabály futtatásához., Különösen a PSUseCompatibleSyntax megköveteli a parancsfájllal megcélzott PowerShell verziók listáját.
Futtatás ez a következő kimenettel jelenít meg minket:
Ez azt mondja nekünk, hogy a ]::new()
szintaxis, amelyet használtunk, nem fog működni a PowerShell 3-ban. Ennél jobb, ebben az esetben a szabály valójában javítást javasolt:
$diagnostics = Invoke-ScriptAnalyzer -Path .\archiveScript.ps1 -Settings $settings$diagnostics.SuggestedCorrections
a javasolt korrekció a New-Object
használata., A javasolt módszer itt kissé segítségtelennek tűnhet az összes pozícióinformációval, de később meglátjuk, miért hasznos ez.
Ez a szótár példa természetesen egy kicsit mesterséges (mivel egy hashtable természetesebb lenne), de a PowerShell 3 vagy 4 munkájába dobott csavarkulcs a miatt nem ritka. A PSUseCompatibleSyntax szabály figyelmeztet az osztályokra, a munkafolyamatokra és ausing
utasításokra is, a PowerShell verzióitól függően.,
még nem fogjuk megtenni a javasolt változást, mivel előbb még többet mutathatunk meg.
A parancshasználat ellenőrzése a PSUseCompatibleCommands
segítségével most ellenőrizni akarjuk a parancsokat. Mivel a parancs kompatibilitás egy kicsit bonyolultabb, mint a szintaxis (mivel a rendelkezésre álló parancsok több, mint amit változata PowerShell fut), meg kell célozni profilok helyett.
A profilok a közös PowerShell környezeteket futtató készletgépekből származó információk katalógusai., Az is szállítjuk PSScriptAnalyzer nem mindig egyezik a munkakörnyezet tökéletesen, de elég közel (ez is egy módja annak, hogy létrehoz egy saját profilt, részletesen egy későbbi blogbejegyzésben). A mi esetünkben a PowerShell 3.0, a PowerShell 5.1 és a PowerShell 6.2 Windows operációs rendszert próbáljuk meg célozni. Megvan az első két profil, de az utolsó esetben 6.1-et kell céloznunk. Ezek a célok nagyon közel vannak, így a figyelmeztetések továbbra is relevánsak lesznek a PowerShell 6.2 használatához. Később, amikor egy 6.2-es profil elérhetővé válik, át tudunk váltani erre.,
meg kell nézni a PSUseCompatibleCommands dokumentáció egy listát a profilok alapértelmezés szerint elérhető. A kívánt célpontot választani:
A hosszú nevek, a jobb vagy a canonical profil azonosítók, amelyek használjuk a beállítások:
lehet, hogy egy késedelem az első alkalom, hogy végre, mert a szabályok betöltése a katalógusok a cache. A PowerShell platform minden katalógusa tartalmazza az összes modul részleteit .,NET szerelvények elérhető PowerShell ezen a platformon, amely lehet több, mint 1700 parancsok 15.000 paraméterek és 100 szerelvények 10.000 típusok. De ha betöltődik, a további kompatibilitási elemzés gyors lesz. Kapunk kimenet, mint ez:
RuleName Severity ScriptName Line Message-------- -------- ---------- ---- -------PSUseCompatibleCommands Warning archiveScr 2 The parameter "FullyQualifiedName" is not available for ipt.ps1 command "Import-Module" by default in PowerShell version "3.0" on platform "Microsoft Windows Server 2012 Datacenter"PSUseCompatibleCommands Warning archiveScr 12 The command "Get-FileHash" is not available by default in ipt.ps1 PowerShell version "3.0" on platform "Microsoft Windows Server 2012 Datacenter"PSUseCompatibleCommands Warning archiveScr 18 The parameter "LeafBase" is not available for command ipt.ps1 "Split-Path" by default in PowerShell version "5.1.17763.316" on platform "Microsoft Windows Server 2019 Datacenter"PSUseCompatibleCommands Warning archiveScr 18 The parameter "LeafBase" is not available for command ipt.ps1 "Split-Path" by default in PowerShell version "3.0" on platform "Microsoft Windows Server 2012 Datacenter"PSUseCompatibleCommands Warning archiveScr 19 The command "Compress-Archive" is not available by ipt.ps1 default in PowerShell version "3.0" on platform "Microsoft Windows Server 2012 Datacenter"PSUseCompatibleCommands Warning archiveScr 23 The parameter "NoNewline" is not available for command ipt.ps1 "Out-File" by default in PowerShell version "3.0" on platform "Microsoft Windows Server 2012 Datacenter"
Ez azt mondja, hogy:
-
Import-Module
nem támogatja-FullyQualifiedName
a PowerShell 3.0; -
Get-FileHash
nem létezik a PowerShell 3.0; -
Split-Path
nem-LeafBase
a PowerShell 5.1 vagy PowerShell 3.,0; -
Compress-Archive
nem érhető el a PowerShell 3.0-ban, és; -
Out-File
nem támogatja a-NoNewline
A PowerShell 3.0
egy dolog, amit észrevesz, hogy a div id=”ac80308163″ > funkció nem figyelmeztetnek. Ennek oka az, hogy a kompatibilitási szabályok úgy vannak kialakítva, hogy figyelmen kívül hagyják a felhasználó által megadott parancsokat; egy parancs csak akkor lesz inkompatibilis, ha valamilyen profilban van jelen, nem pedig az egyik célpontban.,
ismét megváltoztathatjuk a szkriptet, hogy kijavítsuk ezeket a figyelmeztetéseket, de mielőtt megtennénk, meg akarom mutatni, hogyan lehet ezt folyamatosabbá tenni; amikor megváltoztatja a szkriptet, szeretné tudni, hogy a módosítások törnek-e kompatibilitást, és ezt könnyű megtenni az alábbi lépésekkel.
A beállítások fájl ismételt meghívása
az első dolog, amit szeretnénk, hogy a PSScriptAnalyzer felhívás több automatizált és reprodukálható. Egy szép lépés ez felé, figyelembe véve a beállításokat hashtable tettünk, fordult be egy deklaratív adatfájlt, elválasztva a ” mi “a”Hogyan”.,
a PSScriptAnalyzer elfogadja a PSD1 elérési útját a -Settings
paraméterben, tehát csak annyit kell tennünk, hogy a hashtable-t PSD1 fájlba fordítsuk, amelyet ./PSScriptAnalyzerSettings.psd1
. Észre tudjuk egyesíteni a beállítások mindkét PSUseCompatibleSyntax, valamint PSUseCompatibleCommands:
Most, hogy tudjuk futtatni a PSScriptAnalyzer újra a parancsfájl használata a beállítások fájlt:
Invoke-ScriptAnalyzer -Path ./archiveScript.ps1 -Settings ./PSScriptAnalyzerSettings.psd1
Ez adja a kimeneti:
RuleName Severity ScriptName Line Message-------- -------- ---------- ---- -------PSUseCompatibleCommands Warning archiveScr 1 The parameter "FullyQualifiedName" is not available for ipt.ps1 command "Import-Module" by default in PowerShell version "3.0" on platform "Microsoft Windows Server 2012 Datacenter"PSUseCompatibleCommands Warning archiveScr 9 The command "Get-FileHash" is not available by default in ipt.ps1 PowerShell version "3.0" on platform "Microsoft Windows Server 2012 Datacenter"PSUseCompatibleCommands Warning archiveScr 12 The parameter "LeafBase" is not available for command ipt.ps1 "Split-Path" by default in PowerShell version "3.0" on platform "Microsoft Windows Server 2012 Datacenter"PSUseCompatibleCommands Warning archiveScr 12 The parameter "LeafBase" is not available for command ipt.ps1 "Split-Path" by default in PowerShell version "5.1.17763.316" on platform "Microsoft Windows Server 2019 Datacenter"PSUseCompatibleCommands Warning archiveScr 13 The command "Compress-Archive" is not available by ipt.ps1 default in PowerShell version "3.0" on platform "Microsoft Windows Server 2012 Datacenter"PSUseCompatibleCommands Warning archiveScr 16 The parameter "NoNewline" is not available for command ipt.ps1 "Out-File" by default in PowerShell version "3.0" on platform "Microsoft Windows Server 2012 Datacenter"PSUseCompatibleSyntax Warning archiveScr 6 The constructor syntax ipt.ps1 "]::new()" is not available by default in PowerShell versions 3,4
Most nem függ semmilyen változók többé, egy külön spefication az elemzés akarsz., Ezzel folyamatos integrációs környezetbe helyezheti ezt, például annak ellenőrzésére, hogy a szkriptek változásai nem törik-e meg a kompatibilitást.
de amit igazán szeretnénk tudni, hogy a PowerShell szkriptek kompatibilisek maradnak a szerkesztésük során. Erre épül a beállításfájl, valamint ott is, ahol a legegyszerűbb a szkript kompatibilissé tételéhez szükséges módosítások elvégzése. Ehhez szeretnénk integrálni a VSCode PowerShell kiterjesztéssel.,
integrálása VSCode on-the-fly kompatibilitás ellenőrzése
amint azt az elején ezt a bejegyzést, VSCode PowerShell kiterjesztés beépített támogatása PSScriptAnalyzer. Valójában az 1.12.0 verziótól kezdve a PowerShell kiterjesztés a PSScriptAnalyzer 1.18-val szállít, ami azt jelenti, hogy nem kell mást tennie, mint egy beállítási fájl létrehozása a kompatibilitási elemzés elvégzéséhez.
már készen áll a beállítási fájlunk az utolsó lépésből való indulásra, tehát csak annyit kell tennünk, hogy a PowerShell kiterjesztést a fájlra irányítjuk a VSCode beállításokban.,
a beállításokat a Ctrl + gombbal nyithatja meg (használja a Cmd-t a Ctrl helyett a macOS-on). A Beállítások nézetben szeretnénk PowerShell > Script Analysis: Settings Path
. A settings.json
nézetben ez"powershell.scriptAnalysis.settingsPath"
., Belépő egy relatív elérési utat is itt fogja találni a beállítások, a fájl a munkaterület, akkor csak egy ./PSScriptAnalyzerSettings.psd1
:
a settings.json
nézet, hogy ez így fog kinézni:
"powershell.scriptAnalysis.settingsPath": "./PSScriptAnalyzerSettings.psd1"
Most, a nyitás a script VSCode látjuk, hogy a “zöld értékeket” a kompatibilitás figyelmeztetések:
a problémák ablak, egy teljes desrciption a inkompatibilitások:
hozzuk helyre a szintaxis probléma első., Ha emlékszel, PSScriptAnalyzer szállít egy javasolt korrekció erre a problémára. VSCode integrálja PSScriptAnalyzer javasolt korrekciókat, illetve lehet alkalmazni őket, ha rákattint a villanykörtét, vagy a Ctrl+Space, amikor a régió a kurzor alatt:
Alkalmazása ez a változás, a forgatókönyv most:
A másik inkompatibilitások nincs korrekciókat; most PSUseCompatibleCommands tudja, mit parancsok állnak rendelkezésre minden platform, de nem az, amit helyettesítő, ha egy parancs nem érhető el., Tehát csak néhány PowerShell tudást kell alkalmaznunk:
valahogy így végzünk (a konkrét megvalósítás nem fontos, de van valami, ami minden verzióban működni fog):
észre kell vennie, hogy gépelés közben a VSCode megjeleníti az írás új elemzését, és a zöld squigglies elesik. Ha végeztünk, tiszta egészségügyi számlát kapunk a szkript kompatibilitásához:
Ez azt jelenti, hogy most már használhatja ezt a szkriptet az összes Megcélozandó PowerShell verzióban., Jobb, ha most konfigurációja van a munkaterületen, így több szkript írásakor folyamatosan ellenőrzi a kompatibilitást. Ha pedig a kompatibilitási célok megváltoznak, mindössze annyit kell tennie, hogy egy helyen módosítja a konfigurációs fájlt, hogy a kívánt célokra mutasson, ekkor kap elemzést a frissített célplatformokról.
összefoglaló
remélhetőleg ebben a blogbejegyzésben van néhány ötlete az új kompatibilitási szabályokról, amelyek a PSScriptAnalyzer 1.18-hoz tartoznak.,
a szintaxis kompatibilitási ellenőrzési szabály, a PSUseCompatibleSyntax, valamint a parancsellenőrzési szabály, a PSUseCompatibleCommands beállítása és használata, mind hashtable konfiguráció, mind a settings PSD1 fájl használatával.
megvizsgáltuk a kompatibilitási szabályok használatát a VSCode PowerShell kiterjesztésével is, ahol alapértelmezés szerint az 1.12.0 verzióból származnak.
Ha megvan a VSCode (1.12.1) PowerShell kiterjesztésének legújabb kiadása, beállíthatja a konfigurációs fájlt, majd azonnal ellenőrizheti a kompatibilitást.,
a következő blogbejegyzést, megnézzük, hogyan kell használni ezeket a szabályokat PSUseCompatibleTypes (amely ellenőrzi .NETTÓ típusú statikus módszerek állnak rendelkezésre a cél platformok) használható segít forgatókönyvet írni, hogy a munka cross platform át a Windows, mind a Linux, mind Windows PowerShell, valamint PowerShell Mag.
Rob Holt
szoftvermérnök
PowerShell csapat