Käyttämällä PSScriptAnalyzer tarkistaa PowerShell versio yhteensopivuus

0 Comments

PSScriptAnalyzer versio 1.18 julkaistiin äskettäin, ja mukana tehokkaita uusia sääntöjä, jotka voi tarkistaa PowerShell skriptit yhteensopimattomuudet muiden PowerShell versiot ja ympäristöt.

tämä blogi, ensimmäinen sarjassa, näemme, miten käyttää näitä uusia sääntöjä tarkistaa käsikirjoituksen ongelmia käynnissä PowerShell 3, 5.1 ja 6.

odota, mikä on PSScriptAnalyzer?,

PSScriptAnalzyer on moduuli, joka tarjoaa staattinen analyysi (tai linting) ja jotkut dynaaminen analyysi (perustuu valtion oman ympäristö) PowerShell. Se on löytää ongelmat ja korjata huonoja tapoja PowerShell skriptejä kuten luoda niitä, samalla tavalla C# compiler antaa sinulle varoitukset ja löytää virheitä, C# koodi, ennen kuin se on teloitettiin.,

Jos käytät VSCode PowerShell tiedostotunnistetta, olet ehkä nähnyt ”vihreä käyrät” ja ongelma raportoi, että PSScriptAnalyzer luo skriptejä tekijä:

Voit asentaa PSScriptAnalyzer käyttää omia skriptejä:

Install-Module PSScriptAnalyzer -Scope CurrentUser

PSScriptAnalyzer toimii käynnissä joukko sääntöjä skriptejä, joista jokainen itsenäisesti arvioi joitakin kysymys., Esimerkiksi AvoidUsingCmdletAliases tarkistaa, että peitenimet eivät voi käyttää skriptejä, ja MisleadingBackticks tarkistaa, että backticks päissä linjat eivät seuraa välilyönnillä.

lisätietoja on PSScriptAnalyzer deep dive-blogisarjassa.

Esittelyssä yhteensopivuus tarkistaa säännöt

uusi yhteensopivuuden tarkistaminen-toiminto on esittänyt kolme uusia sääntöjä:

  • PSUseCompatibleSyntax, joka tarkistaa, onko syntaksi käytetty skripti toimii muissa PowerShell versiot.,
  • PSUseCompatibleCommands, joka tarkistaa, ovatko skriptissä käytetyt komennot saatavilla muissa PowerShell-ympäristöissä.
  • PSUseCompatibleTypes, joka tarkistaa, ovatko.Net-tyypit ja staattiset menetelmät/ominaisuudet saatavilla muissa PowerShell-ympäristöissä.

syntaksin tarkistussääntö vaatii yksinkertaisesti luettelon PowerShell-versioista, jotka haluat kohdistaa, ja kertoo, jos skriptissäsi käytetty syntaksi ei toimi missään näistä versioista.,

komento-ja tyyppitarkastussäännöt ovat kehittyneempiä ja perustuvat yleisesti käytettyjen PowerShell-alustojen profiileihin (luetteloihin komennoista ja tyypeistä). Ne vaativat konfiguraatiota käyttääkseen näitä profiileja, joita käymme läpi alla.

tämä viesti, me tarkastelemme määrittäminen ja käyttäminen PSUseCompatibleSyntax ja PSUseCompatibleCommands tarkistaa, että skripti toimii eri versioihin Powershellissä. Me tarkastelemme PSUseCompatibleTypes myöhemmin postitse, vaikka se on määritetty hyvin, samoin PSUseCompatibleCommands.,

esimerkki: pieni PowerShell script

Kuvittele, meillä on pieni (ja keinotekoinen) arkistointia script-tallentaa .\archiveScript.ps1:

Tämä kirjoitus oli kirjoitettu PowerShell 6.2, ja olemme testattu, että se toimii siellä. Mutta haluamme myös ajaa sitä muilla koneilla, joista osa ajaa PowerShell 5.1 ja osa ajaa PowerShell 3.0.

Ihannetapauksessa testaamme sitä näillä muilla alustoilla, mutta olisi mukavaa, jos voisimme yrittää silittää mahdollisimman monta bugia etukäteen.,

syntaksin tarkistaminen PSUseCompatibleSyntax

ensimmäinen ja helpoin sääntö on PSUseCompatibleSyntax. Luomme joitain asetuksia Psscriptanalyzerille, jotta sääntö voidaan ottaa käyttöön, ja sitten suoritamme analyysin käsikirjoituksestamme saadaksemme takaisin diagnostiikan yhteensopivuudesta.

Psscriptanalysaattorin juokseminen on suoraviivaista., Se tulee kuin PowerShell-moduuli, joten kun se on asennettu module polku vain vedota teidän tiedoston Invoke-ScriptAnalyzer näin:

Invoke-ScriptAnalyzer -Path ".\archiveScript.ps1`

hyvin yksinkertainen vetoaminen, kuten tämä yksi toimii PSScriptAnalyzer käyttämällä sen oletuksena sääntöjä ja kokoonpanoissa käsikirjoituksen et kohta se.

kuitenkin, koska ne vaativat kohdennetumpaa konfigurointia, yhteensopivuussäännöt eivät ole oletusarvoisesti käytössä. Sen sijaan, meidän täytyy toimittaa joitakin asetuksia ajaa syntaksin tarkistus sääntö., Erityisesti PSUseCompatibleSyntax vaatii luettelon PowerShell-versioista, jotka kohdistat skriptilläsi.

Käynnissä tämä antaa meille seuraavat lähtö:

– Tämä kertoo meille, että ]::new() syntax käytimme ei toimi PowerShell 3. Parempi kuin, että tässä tapauksessa sääntö on itse asiassa ehdotettu korjaus:

$diagnostics = Invoke-ScriptAnalyzer -Path .\archiveScript.ps1 -Settings $settings$diagnostics.SuggestedCorrections

ehdotettu korjaus on käyttää New-Object sijaan., Tapa, jolla tämä on ehdotettu, saattaa vaikuttaa hieman hyödyttömältä tässä kaikki sijaintitiedot, mutta näemme myöhemmin, miksi tämä on hyödyllistä.

Tämä sanakirja esimerkki on hieman keinotekoinen tietenkin (koska hashtable olisi tullut enemmän luonnollisesti), mutta ottaa kapuloita heitetään toimii PowerShell 3 tai 4, koska ::new() ei ole harvinaista. Se PSUseCompatibleSyntax sääntö myös varoittaa luokat, työnkulut ja using lausunnot riippuen versiot PowerShell olet authoring varten.,

emme aio tehdä ehdotettua muutosta vielä, koska ensin on enemmän näytettävää.

komennon käytön tarkistaminen Psusecompatiblecommandsilla

haluamme nyt tarkistaa komennot. Koska komento yhteensopivuus on hieman monimutkaisempi kuin syntaksi (koska saatavuus komentoja riippuu enemmän kuin mitä versio PowerShell on ajaa), meidän täytyy kohdistaa profiileja sijaan.

profiilit ovat luetteloita tiedoista, jotka on otettu varastokoneista, jotka käyttävät yhteisiä PowerShell-ympäristöjä., Ne toimitetaan PSScriptAnalyzer voi aina vastaa työskentely-ympäristön täysin, mutta ne tulevat aika lähelle (siellä on myös tapa luoda oma profiili, yksityiskohtaisesti myöhemmin blogi). Meidän tapauksessamme yritämme kohdistaa PowerShell 3.0, PowerShell 5.1 ja PowerShell 6.2 Windowsiin. Meillä on kaksi ensimmäistä profiilia, mutta viimeisessä tapauksessa meidän täytyy kohdistaa 6.1 sen sijaan. Nämä tavoitteet ovat hyvin lähellä, joten varoitukset on edelleen syytä käyttää PowerShell 6.2. Myöhemmin, kun 6.2-profiili on saatavilla, voimme vaihtaa sen.,

meidän on katsottava psusecompatiblecommands-dokumentaatiosta luettelo profiileista, jotka ovat oletusarvoisesti saatavilla. Meidän halutut tavoitteet meidän valita:

pitkä nimet oikealla ovat kanoninen profiilia tunnisteet, joita käytämme asetukset:

saattaa olla viive ensimmäisen kerran käytät tätä, koska säännöt on ladata luettelot osaksi välimuistiin. Jokainen luettelo PowerShell Alustan sisältää tiedot kaikista moduuleista ja .,NET kokoonpanot PowerShellin käytettävissä kyseisellä alustalla, joka voi olla jopa 1700 komennot 15000 parametrit ja 100 kokoonpanot 10000 tyyppiä. Mutta kun se on ladattu, yhteensopivuusanalyysi on nopea. Saamme tuotos, kuten tämä:

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"

– Tämä kertoo meille, että:

  • Import-Module ei tue -FullyQualifiedName vuonna PowerShell 3.0;
  • Get-FileHash ei ole olemassa PowerShell 3.0;
  • Split-Path ei ole -LeafBase Powershellissä 5.1 tai PowerShell 3.,0;
  • Compress-Archive ei ole käytettävissä PowerShell 3.0, ja;
  • Out-File ei tue -NoNewline vuonna PowerShell 3.0

Yksi asia, jonka huomaat on, että Get-FoldersToArchive toiminto ei ole varoitettu. Tämä johtuu siitä, että yhteensopivuus sääntöjen tarkoituksena on jättää käyttäjä-edellyttäen, komennot, komento on vain merkitty yhteismarkkinoille soveltumattomaksi, jos se on läsnä joitakin profiilin ja ole yksi teidän tavoitteita.,

Jälleen, emme voi muuttaa käsikirjoituksen korjata nämä varoitukset, mutta ennen kuin teemme sen, haluan näyttää, miten tehdä tämä enemmän jatkuva kokemus; kun muutat script, haluat tietää, jos teet muutoksia rikkoa yhteensopivuuden, ja se on helppo tehdä alla olevien ohjeiden mukaisesti.

Käyttämällä asetukset tiedoston toistuva vetoaminen

ensimmäinen asia haluamme on tehdä PSScriptAnalyzer vetoaminen enemmän automatisoitu ja toistettavissa. Mukava askel kohti tätä on ottaa asetukset hashtable teimme ja kääntämällä se deklaratiivinen datatiedosto, erottamalla ”mitä” ja ”miten”.,

PSScriptAnalyzer hyväksyy polku PSD1 -Settings parametri, joten kaikki meidän täytyy tehdä, on kääntää hashtable osaksi PSD1-tiedoston, joka tehdään ./PSScriptAnalyzerSettings.psd1. Huomaa, että voimme yhdistää asetuksia sekä PSUseCompatibleSyntax ja PSUseCompatibleCommands:

Nyt voimme ajaa PSScriptAnalyzer jälleen script käyttämällä asetukset-tiedosto:

Invoke-ScriptAnalyzer -Path ./archiveScript.ps1 -Settings ./PSScriptAnalyzerSettings.psd1

Tämä antaa output:

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

– Nyt meillä ei ole riippuvainen mistään muuttujia enää ja on erillinen spefication analyysin haluat., Käyttämällä tätä, voit laittaa tämän huomioon jatkuvan integraation ympäristöissä, esimerkiksi tarkistaa, että muutokset skriptit älä riko yhteensopivuutta.

mutta haluamme todella tietää, että PowerShell-skriptit pysyvät yhteensopivina, kun muokkaat niitä. Se on mitä settings-tiedosto on building, ja myös missä se on helpoin tehdä muutokset sinun täytyy tehdä script yhteensopiva. Tätä varten haluamme integroida VSCode PowerShell-laajennuksen.,

Integrointi VSCode on-the-fly yhteensopivuuden tarkistaminen

Kuten edellä alussa tämän post, VSCode PowerShell extension on sisäänrakennettu tuki PSScriptAnalyzer. Itse asiassa, kuten versio 1.12.0, PowerShell-laajennuksen mukana PSScriptAnalyzer 1.18, mikä tarkoittaa, sinun ei tarvitse tehdä mitään muuta kuin luoda asetustiedoston tehdä yhteensopivuus analyysi.

asetustiedostomme on jo valmis menemään viimeisestä vaiheesta, joten meidän tarvitsee vain osoittaa PowerShell-laajennus tiedostoon VSCode-asetuksissa.,

avaa asetukset-Ctrl+, (käyttää Cmd sijaan Ctrl macOS). Asetusnäkymässä haluamme PowerShell > Script Analysis: Settings Path. settings.json mielestäni tämä on "powershell.scriptAnalysis.settingsPath"., Kirjoittamalla suhteellisen polun täältä löydät asetustiedoston meidän työtila, joten me vain laittaa ./PSScriptAnalyzerSettings.psd1:

settings.json näytä tämä näyttää:

"powershell.scriptAnalysis.settingsPath": "./PSScriptAnalyzerSettings.psd1"

Nyt, avaa script VSCode näemme ”vihreä käyrät” yhteensopivuus varoitukset:

ongelmia-ruudussa, saat täyden desrciption kaikki yhteensopimattomuudet:

katsotaanpa korjata syntaksin ongelma ensin., Jos muistat, PSScriptAnalyzer toimittaa ehdotetun korjauksen tähän ongelmaan. VSCode integroituu PSScriptAnalyzer ehdotti korjauksia ja osaa soveltaa niitä, jos klikkaat hehkulamppu tai Ctrl+Space, kun alue on kohdistimen alla:

Hakeminen tämä muutos, käsikirjoitus on nyt:

muut yhteensopimattomuudet ei tarvitse korjauksia; nyt PSUseCompatibleCommands tietää, mitä komennot ovat saatavilla kunkin alustan, mutta ei, mitä korvike, kun komento ei ole käytettävissä., Joten meidän täytyy vain soveltaa joitakin PowerShell tietoa:

päädymme jotain tällaista (erityinen täytäntöönpanoa on merkityksetön, mutta meillä on jotain, joka toimii kaikki versiot):

Sinun pitäisi huomata, että kuten kirjoitat, VSCode näyttää uusi analyysi siitä, mitä olet kirjoittamassa ja vihreät käyrät pudota pois. Kun olemme valmiita saamme puhtaat paperit script yhteensopivuus:

Tämä tarkoittaa, että voit nyt voi käyttää tätä script kaikissa PowerShell versiot sinun täytyy kohdistaa., Parempi, sinulla on nyt kokoonpano työtilassasi, joten kun kirjoitat enemmän skriptejä, yhteensopivuutta tarkistetaan jatkuvasti. Ja jos yhteensopivuus tavoitteiden muutos, kaikki sinun täytyy tehdä, on muuttaa configuration file yhteen paikkaan osoittamaan haluamasi tavoitteet, jolloin saat analyysin päivitetty kohteen ympäristöissä.

Yhteenveto

toivottavasti tässä blogikirjoituksessa sait jonkinlaisen käsityksen uusista yhteensopivuussäännöistä, jotka tulevat PSScriptAnalyzer 1.18: n kanssa.,

Olemme käsitelleet, miten perustaa ja käyttää syntaksia yhteensopivuuden tarkistaminen sääntö, PSUseCompatibleSyntax, ja komento tarkistaa sääntö, PSUseCompatibleCommands, sekä käyttää hashtable kokoonpano ja asetukset PSD1-tiedoston avaamiseen.

olemme myös tarkastelleet yhteensopivuussääntöjen käyttöä VSCode-laajennuksen kanssa, jossa ne tulevat oletusarvoisesti versiosta 1.12.0.

Jos sinulla on uusin PowerShell laajennus VSCode (1.12.1), voit määrittää configuration file ja heti saada yhteensopivuus tarkistaa.,

seuraava blogi, me tarkastelemme, miten käyttää näitä sääntöjä ja PSUseCompatibleTypes (joka tarkistaa, jos .NET tyypit ja staattisia menetelmiä ovat saatavilla kohdeympäristöt) voidaan käyttää auttaa sinua kirjoittaa skriptejä, jotka toimivat cross platform koko Windows ja Linux käyttää sekä Windows PowerShell ja PowerShell Ydin.

Rob Holt

ohjelmoija

PowerShell Joukkue


Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *