Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Questo articolo descrive varie funzionalità di PSScriptAnalyzer e come usarle.
Errori del parser
A partire dalla versione 1.18.0, PSScriptAnalyzer genera errori del parser come record di diagnostica nel flusso di output.
Invoke-ScriptAnalyzer -ScriptDefinition '"b" = "b"; function eliminate-file () { }'
RuleName Severity ScriptName Line Message
-------- -------- ---------- ---- -------
InvalidLeftHandSide ParseError 1 The assignment expression isn't
valid. The input to an
assignment operator must be an
object that's able to accept
assignments, such as a variable
or a property.
PSUseApprovedVerbs Warning 1 The cmdlet 'eliminate-file' uses an
unapproved verb.
RuleName è impostato su ErrorId dell'errore del parser.
Per eliminare ParseErrors, non includerlo come valore nel parametro Severity .
$invokeScriptAnalyzerSplat = @{
ScriptDefinition = '"b" = "b"; function eliminate-file () { }'
Severity = 'Warning'
}
Invoke-ScriptAnalyzer @invokeScriptAnalyzerSplat
RuleName Severity ScriptName Line Message
-------- -------- ---------- ---- -------
PSUseApprovedVerbs Warning 1 The cmdlet 'eliminate-file' uses an
unapproved verb.
Soppressione delle regole
È possibile eliminare una regola decorando uno script, una funzione o un parametro con . SuppressMessageAttribute di NET. Il costruttore per SuppressMessageAttribute accetta due parametri: una categoria e un ID controllo. Impostare il parametro categoryID sul nome della regola che si desidera eliminare e impostare il parametro checkID su una stringa vuota o null. Facoltativamente, è possibile aggiungere un terzo parametro denominato con una giustificazione per l'eliminazione del messaggio:
function SuppressMe()
{
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSProvideCommentHelp', '',
Justification='Just an example')]
param()
Write-Verbose -Message "I'm making a difference!"
}
Nell'ambito dello script, della funzione o del parametro decorato, tutte le violazioni delle regole vengono eliminate.
Per eliminare un messaggio su un parametro specifico, impostare il parametro CheckId di SuppressMessageAttribute sul nome del parametro:
function SuppressTwoVariables()
{
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSProvideDefaultParameterValue', 'b')]
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSProvideDefaultParameterValue', 'a')]
param([string]$a, [int]$b)
{
}
}
Utilizzare la proprietà Scope di SuppressMessageAttribute per limitare l'eliminazione delle regole alle funzioni o alle classi all'interno dell'ambito dell'attributo.
Utilizzare il valore Funzione per eliminare le violazioni in tutte le funzioni all'interno dell'ambito dell'attributo. Utilizzare il valore Class per eliminare le violazioni in tutte le classi all'interno dell'ambito dell'attributo:
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSProvideCommentHelp', '', Scope='Function')]
param()
function InternalFunction
{
param()
Write-Verbose -Message "I am invincible!"
}
Puoi ulteriormente limitare la soppressione in base al nome di una funzione, parametro, classe, variabile o oggetto impostando la proprietà Target di SuppressMessageAttribute su un'espressione regolare o un modello jolly.
Ad esempio, per eliminare la violazione della regola PSAvoidUsingWriteHost in start-bar e start-baz ma non in start-foo e start-bam:
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingWriteHost', '',
Scope='Function', Target='start-ba[rz]')]
param()
function start-foo {
write-host "start-foo"
}
function start-bar {
write-host "start-bar"
}
function start-baz {
write-host "start-baz"
}
function start-bam {
write-host "start-bam"
}
Per eliminare le violazioni in tutte le funzioni:
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingWriteHost', '',
Scope='Function', Target='*')]
Param()
Per eliminare le violazioni in start-bar, start-baz ma start-bam non in start-foo:
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingWriteHost', '',
Scope='Function', Target='start-b*')]
Param()
Annotazioni
Gli errori del parser non possono essere eliminati con SuppressMessageAttribute.
Supporto delle impostazioni in ScriptAnalyzer
È possibile creare impostazioni che descrivono le regole di ScriptAnalyzer da includere o escludere in base alla gravità. Utilizzare il parametro Settings di Invoke-ScriptAnalyzer per specificare la configurazione.
Il parametro Impostazioni ti permette di creare una configurazione personalizzata per un ambiente specifico.
Questo parametro accetta i seguenti tipi di oggetti:
- Un percorso verso un
.psd1file contenente un profilo definito dall'utente - Un oggetto hashtable contenente impostazioni
- Il nome di un preset integrato
Preset integrati
ScriptAnalyzer fornisce un set di preimpostazioni predefinite che possono essere utilizzate per analizzare gli script. Il modulo PSScriptAnalyzer include un insieme di preset integrati che puoi usare con il parametro Settings . Ad esempio, se si desidera eseguire le regole di PowerShell Gallery nel modulo, usare il comando seguente:
Invoke-ScriptAnalyzer -Path /path/to/module/ -Settings PSGallery -Recurse
Puoi specificare più preset separandoli con una virgola. Puoi usare il completamento delle schede per vedere i preset disponibili. I preset integrati sono memorizzati nella Settings cartella del modulo PSScriptAnalyzer . Puoi elencare i preset integrati eseguendo il seguente comando:
Get-ChildItem "$($(Get-Module PSScriptAnalyzer).ModuleBase)\Settings\*.psd1"
Directory: C:\Users\sewhee\Documents\PowerShell\Modules\psscriptAnalyzer\1.25.0\Settings
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 3/20/2026 6:41 PM 15025 CmdletDesign.psd1
-a--- 3/20/2026 6:41 PM 16330 CodeFormatting.psd1
-a--- 3/20/2026 6:41 PM 16331 CodeFormattingAllman.psd1
-a--- 3/20/2026 6:41 PM 16331 CodeFormattingOTBS.psd1
-a--- 3/20/2026 6:41 PM 16375 CodeFormattingStroustrup.psd1
-a--- 3/20/2026 6:41 PM 14674 DSC.psd1
-a--- 3/20/2026 6:41 PM 15735 PSGallery.psd1
-a--- 3/20/2026 6:41 PM 15157 ScriptFunctions.psd1
-a--- 3/20/2026 6:41 PM 14736 ScriptingStyle.psd1
-a--- 3/20/2026 6:41 PM 14985 ScriptSecurity.psd1
Per vedere le regole incluse in un preset, puoi aprire il .psd1 file in un editor di testo.
Explicit
Il seguente esempio mostra come invocare Script Analyzer con impostazioni che escludono due regole dal set predefinito di regole e qualsiasi regola con gravità diversa da Errore e Avviso.
$pssaSettings = @{
Severity=@('Error','Warning')
ExcludeRules=@('PSAvoidUsingCmdletAliases', 'PSAvoidUsingWriteHost')
}
Invoke-ScriptAnalyzer -Path MyScript.ps1 -Settings $pssaSettings
Potresti anche salvare quell'hashtable in un .psd1 file e poi invocare Script Analyzer con quel file di impostazioni.
Invoke-ScriptAnalyzer -Path MyScript.ps1 -Settings PSScriptAnalyzerSettings.psd1
Ricerca implicita
Se si inserisce un file di impostazioni denominato PSScriptAnalyzerSettings.psd1 nella radice del progetto, PSScriptAnalyzer lo individua quando si passa la radice del progetto come parametro Path .
Invoke-ScriptAnalyzer -Path "C:\path\to\project" -Recurse
Fornire impostazioni esplicitamente ha una priorità maggiore rispetto a questa modalità implicita. Puoi trovare file di esempio impostazioni nella Settings cartella del modulo PSScriptAnalyzer .
Verificare la compatibilità della versione di PowerShell
PSScriptAnalyzer può verificare la presenza di incompatibilità negli script di PowerShell con altre versioni e ambienti di PowerShell. PSScriptAnalyzer include quattro regole che verificano la presenza di problemi di compatibilità:
- PSUseCompatibleCmdlets controlla se i cmdlet utilizzati in uno script sono disponibili in altri ambienti PowerShell
- PSUseCompatibleCommands controlla se i comandi utilizzati in uno script sono disponibili in altri ambienti PowerShell
- PSUseCompatibleSyntax verifica se una sintassi usata in uno script è compatibile in altre versioni di PowerShell
- PSUseCompatibleTypes controlla se i tipi .NET e i metodi o le proprietà statici sono disponibili in altri ambienti PowerShell
Per altre informazioni su come usare queste regole, vedere Uso di PSScriptAnalyzer per verificare la compatibilità della versione di PowerShell nel blog del team di PowerShell.
Regole personalizzate
È possibile fornire uno o più percorsi alle regole personalizzate nel file delle impostazioni. È importante che questi percorsi puntino alla cartella di un modulo, che usa in modo implicito il manifesto del modulo, o al file di script del modulo (.psm1). Il modulo deve esportare le funzioni delle regole personalizzate per Export-ModuleMember renderle disponibili per PSScriptAnalyzer.
In questo esempio, la proprietà CustomRulePath indica due moduli diversi. Entrambi i moduli esportano le funzioni della regola con il verbo Measure , quindi Measure-* viene utilizzato per la proprietà IncludeRules.
@{
CustomRulePath = @(
'.\output\RequiredModules\DscResource.AnalyzerRules'
'.\tests\QA\AnalyzerRules\SqlServerDsc.AnalyzerRules.psm1'
)
IncludeRules = @(
'Measure-*'
)
}
È inoltre possibile aggiungere regole predefinite elencandole nella proprietà IncludeRules . Quando si includono le regole predefinite, è importante impostare la proprietà IncludeDefaultRules su $true; in caso contrario, vengono utilizzate le regole predefinite.
@{
CustomRulePath = @(
'.\output\RequiredModules\DscResource.AnalyzerRules'
'.\tests\QA\AnalyzerRules\SqlServerDsc.AnalyzerRules.psm1'
)
IncludeDefaultRules = $true
IncludeRules = @(
# Default rules
'PSAvoidDefaultValueForMandatoryParameter'
'PSAvoidDefaultValueSwitchParameter'
# Custom rules
'Measure-*'
)
}
Utilizzo di regole personalizzate in Visual Studio Code (VS Code)
Puoi anche usare le regole personalizzate fornite nel file delle impostazioni in VS Code. Aggiungi un file di impostazioni dell'area di lavoro VS Code (.vscode/settings.json) con i seguenti contenuti.
{
"powershell.scriptAnalysis.settingsPath": ".vscode/analyzersettings.psd1",
"powershell.scriptAnalysis.enable": true,
}
ScriptAnalyzer come libreria .NET
È possibile utilizzare direttamente il motore e le funzionalità di ScriptAnalyzer come libreria.
Di seguito sono riportate le interfacce pubbliche:
using Microsoft.Windows.PowerShell.ScriptAnalyzer;
public void Initialize(System.Management.Automation.Runspaces.Runspace runspace,
Microsoft.Windows.PowerShell.ScriptAnalyzer.IOutputWriter outputWriter,
[string[] customizedRulePath = null],
[string[] includeRuleNames = null],
[string[] excludeRuleNames = null],
[string[] severity = null],
[bool suppressedOnly = false],
[string profile = null])
public System.Collections.Generic.IEnumerable<DiagnosticRecord> AnalyzePath(string path,
[bool searchRecursively = false])
public System.Collections.Generic.IEnumerable<IRule> GetRule(string[] moduleNames,
string[] ruleNames)
Correzione delle violazioni
Puoi usare l'interruttore Fix per sostituire automaticamente i contenuti che causano violazioni con un'alternativa suggerita. Inoltre, poiché Invoke-ScriptAnalyzer implementa SupportsShouldProcess, è possibile utilizzare WhatIf o Confirm per individuare le correzioni da applicare. Dovresti usare il controllo del contenuto durante le correzioni, poiché alcune modifiche, come quella per EvitareUsingPlainTextForPassword, potrebbero richiedere altre modifiche agli script che non possono essere fatte automaticamente. La codifica iniziale non può sempre essere preservata quando applichi automaticamente i suggerimenti.
Dovresti controllare la codifica dei file se i tuoi script dipendono da una codifica particolare.
La proprietà SuggestedCorrections del record errore consente scenari di correzione rapida in editor come VS Code. Forniamo SuggestedCorrection valido per le seguenti regole:
- AvoidAlias
- AvoidUsingPlainTextForPassword
- Backtick fuorviante
- Campo manifesto ModuloMancante
- UseToExportFieldsInManifest