A PSScriptAnalyzer, hogy ellenőrizze PowerShell verzió kompatibilitás

0 Comments

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.jsonné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


Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük