Condividi tramite


Set-StrictMode

Stabilisce e applica regole di codifica in espressioni, script e blocchi di script.

Sintassi

Set-StrictMode
   -Version <Version>
   [<CommonParameters>]
Set-StrictMode
   [-Off]
   [<CommonParameters>]

Descrizione

Il Set-StrictMode cmdlet configura la modalità rigorosa per l'ambito corrente e tutti gli ambiti figlio e lo attiva e disattiva. Quando la modalità rigorosa è attiva, PowerShell genera un errore di terminazione quando il contenuto di un'espressione, uno script o un blocco di script viola le regole di codifica consigliate di base.

Usare il parametro Version per determinare quali regole di codifica vengono applicate.

Set-PSDebug -Strict il cmdlet attiva la modalità rigorosa per l'ambito globale. Set-StrictMode influisce solo sull'ambito corrente e sui relativi ambiti figlio. È pertanto possibile usarlo in uno script o in una funzione per eseguire l'override dell'impostazione ereditata dall'ambito globale.

Quando Set-StrictMode è disattivato, PowerShell ha i comportamenti seguenti:

  • Si presuppone che le variabili non inizializzate abbiano un valore pari a 0 (zero) o $Null, a seconda del tipo
  • Riferimenti alle proprietà non esistenti restituiscono $Null
  • I risultati della sintassi della funzione non corretta variano con le condizioni di errore
  • Tentativo di recuperare un valore usando un indice non valido in una matrice restituisce $Null

Esempio

Esempio 1: Attivare la modalità rigorosa come versione 1.0

# Strict mode is off by default.
$a -gt 5

False

Set-StrictMode -Version 1.0
$a -gt 5

The variable $a cannot be retrieved because it has not been set yet.

At line:1 char:3
+ $a <<<<  -gt 5
+ CategoryInfo          : InvalidOperation: (a:Token) [], RuntimeException
+ FullyQualifiedErrorId : VariableIsUndefined

Con la modalità rigorosa impostata sulla versione 1.0, tenta di fare riferimento alle variabili che non sono inizializzate.

Esempio 2: Attivare la modalità rigorosa come versione 2.0

# Strict mode is off by default.
function add ($a, $b) {
    '$a = ' + $a
    '$b = ' + $b
    '$a+$b = ' + ($a + $b)
}
add 3 4

$a = 3
$b = 4
$a+$b = 7

add(3,4)

$a = 3 4
$b =
$a+$b = 3 4

Set-StrictMode -Version 2.0
add(3,4)

The function or command was called like a method. Parameters should be separated by spaces,
as described in 'Get-Help about_Parameter.'
At line:1 char:4
+ add <<<< (3,4)
+ CategoryInfo          : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : StrictModeFunctionCallWithParens

Set-StrictMode -Off
$string = "This is a string."
$string.Month -eq $null

True

Set-StrictMode -Version 2.0
$string = "This is a string."
$string.Month -eq $null

Property 'Month' cannot be found on this object; make sure it exists.
At line:1 char:9
+ $string. <<<< month
+ CategoryInfo          : InvalidOperation: (.:OperatorToken) [], RuntimeException
+ FullyQualifiedErrorId : PropertyNotFoundStrict

Questo comando attiva la modalità rigorosa e lo imposta sulla versione 2.0. Di conseguenza, PowerShell restituisce un errore se si usa la sintassi del metodo, che usa parentesi e virgole, per una chiamata di funzione o fare riferimento a variabili non inizializzate o proprietà non esistenti.

L'output di esempio mostra l'effetto della modalità rigorosa versione 2.0.

Senza la modalità strict versione 2.0, il valore "(3,4)" viene interpretato come singolo oggetto di matrice a cui non viene aggiunto niente. Usando la modalità rigorosa versione 2.0, viene interpretata correttamente come sintassi difettosa per l'invio di due valori.

Senza la versione 2.0, il riferimento alla proprietà Month non esistente di una stringa restituisce solo $Null. Usando la versione 2.0, viene interpretato correttamente come errore di riferimento.

Esempio 3: Attivare la modalità rigorosa come versione 3.0

Con la modalità rigorosa impostata su Disattivato, non valido o fuori dai limiti gli indici restituiscono valori Null.

# Strict mode is off by default.
$a = @(1)
$a[2] -eq $null
$a['abc'] -eq $null

True
True

Set-StrictMode -Version 3
$a = @(1)
$a[2] -eq $null
$a['abc'] -eq $null

Index was outside the bounds of the array.
At line:1 char:1
+ $a[2] -eq $null
+ ~~~~~~~~~~~~~~~
    + CategoryInfo          : OperationStopped: (:) [], IndexOutOfRangeException
    + FullyQualifiedErrorId : System.IndexOutOfRangeException

Cannot convert value "abc" to type "System.Int32". Error: "Input string was not in a correct format."
At line:1 char:1
+ $a['abc'] -eq $null
+ ~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvalidCastFromStringToInteger

Con la modalità rigorosa impostata sulla versione 3 o successiva, gli indici non validi o non associati comportano errori.

Parametri

-Off

Indica che questo cmdlet disattiva la modalità rigorosa per l'ambito corrente e tutti gli ambiti figlio.

Type:SwitchParameter
Position:Named
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-Version

Specifica le condizioni che generano errori in modalità strict. Questo parametro accetta qualsiasi numero di versione di PowerShell valido. Qualsiasi numero superiore a 3 viene considerato più recente.

I valori effettivi per questo parametro sono:

  • 1.0
    • Impedisce i riferimenti alle variabili non inizializzate, ad eccezione delle variabili non inizializzate nelle stringhe.
  • 2,0
    • Impedisce riferimenti a variabili non inizializzate. Ciò include variabili non inizializzate in stringhe.
    • Impedisce riferimenti alle proprietà non esistenti di un oggetto.
    • Impedisce le chiamate di funzione che usano la sintassi per chiamare i metodi.
  • 3,0
    • Impedisce riferimenti a variabili non inizializzate. Ciò include variabili non inizializzate in stringhe.
    • Impedisce riferimenti alle proprietà non esistenti di un oggetto.
    • Impedisce le chiamate di funzione che usano la sintassi per chiamare i metodi.
    • Non consentire limiti o indici di matrice non risolti.
  • Più recente
    • Seleziona la versione più recente disponibile. La versione più recente è la più rigorosa. Usare questo valore per assicurarsi che gli script usino la versione più rigorosa disponibile, anche quando vengono aggiunte nuove versioni a PowerShell.
Type:Version
Aliases:v
Position:Named
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

Input

None

Non è possibile inviare input tramite pipe a questo cmdlet.

Output

None

Questo cmdlet non restituisce alcun output.

Note

Set-StrictMode è efficace solo nell'ambito in cui è impostato e negli ambiti figlio. Per altre informazioni sugli ambiti in PowerShell, vedere about_Scopes.