Set-StrictMode
Estabelece e impõe regras de codificação em expressões, scripts e blocos de script.
Sintaxe
Set-StrictMode
-Version <Version>
[<CommonParameters>]
Set-StrictMode
[-Off]
[<CommonParameters>]
Description
O cmdlet Set-StrictMode
configura o modo estrito para o escopo atual e todos os escopos filho e o ativa e desativa. Quando o modo estrito está ativado, o PowerShell gera um erro de encerramento quando o conteúdo de uma expressão, script ou bloco de script viola as regras básicas de codificação de prática recomendada.
Use o parâmetro versão
Set-PSDebug -Strict
cmdlet ativa o modo estrito para o escopo global.
Set-StrictMode
afeta apenas o escopo atual e seus escopos filho. Portanto, você pode usá-lo em um script ou função para substituir a configuração herdada do escopo global.
Quando Set-StrictMode
está desativado, o PowerShell tem os seguintes comportamentos:
- Presume-se que variáveis não inicializadas tenham um valor de 0 (zero) ou
$Null
, dependendo do tipo - Referências a propriedades inexistentes retornam
$Null
- Os resultados da sintaxe de função inadequada variam com as condições de erro
- Tentar recuperar um valor usando um índice inválido em uma matriz retorna
$Null
Exemplos
Exemplo 1: ativar o modo estrito como a versão 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
Com o modo estrito definido como versão 1.0, as tentativas de referenciar variáveis que não são inicializadas falham.
Exemplo 2: ativar o modo estrito como a versão 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
Esse comando ativa o modo estrito e o define como a versão 2.0. Como resultado, o PowerShell retornará um erro se você usar a sintaxe do método, que usa parênteses e vírgulas, para uma chamada de função ou referenciar variáveis não inicializadas ou propriedades inexistentes.
A saída de exemplo mostra o efeito do modo estrito da versão 2.0.
Sem o modo estrito da versão 2.0, o valor "(3,4)" é interpretado como um único objeto de matriz ao qual nada é adicionado. Usando o modo estrito da versão 2.0, ele é interpretado corretamente como sintaxe com falha para enviar dois valores.
Sem a versão 2.0, a referência à propriedade Month inexistente de uma cadeia de caracteres retorna apenas $Null
. Usando a versão 2.0, ela é interpretada corretamente como um erro de referência.
Exemplo 3: Ativar o modo estrito como a versão 3.0
Com o modo estrito definido como Off, os índices inválidos ou fora dos limites retornam valores nulos.
# 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
Com o modo estrito definido como versão 3 ou superior, índices inválidos ou fora dos limites resultam em erros.
Parâmetros
-Off
Indica que esse cmdlet desativa o modo estrito para o escopo atual e todos os escopos filho.
Tipo: | SwitchParameter |
Cargo: | Named |
Valor padrão: | None |
Obrigatório: | True |
Aceitar a entrada de pipeline: | False |
Aceitar caracteres curinga: | False |
-Version
Especifica as condições que causam um erro no modo estrito. Esse parâmetro aceita qualquer número de versão válido do PowerShell. Qualquer número maior que 3 é tratado como última.
Os valores efetivos para este parâmetro são:
- 1.0
- Proíbe referências a variáveis não inicializadas, exceto variáveis não inicializadas em cadeias de caracteres.
- 2.0
- Proíbe referências a variáveis não inicializadas. Isso inclui variáveis não inicializadas em cadeias de caracteres.
- Proíbe referências a propriedades inexistentes de um objeto.
- Proíbe chamadas de função que usam a sintaxe para métodos de chamada.
- 3.0
- Proíbe referências a variáveis não inicializadas. Isso inclui variáveis não inicializadas em cadeias de caracteres.
- Proíbe referências a propriedades inexistentes de um objeto.
- Proíbe chamadas de função que usam a sintaxe para métodos de chamada.
- Proibir fora dos limites ou índices de matriz irrecupeável.
- Mais recente
- Seleciona a versão mais recente disponível. A versão mais recente é a mais rigorosa. Use esse valor para garantir que os scripts usem a versão mais rigorosa disponível, mesmo quando novas versões são adicionadas ao PowerShell.
Tipo: | Version |
Aliases: | v |
Cargo: | Named |
Valor padrão: | None |
Obrigatório: | True |
Aceitar a entrada de pipeline: | False |
Aceitar caracteres curinga: | False |
Entradas
None
Não é possível redirecionar a entrada para este cmdlet.
Saídas
None
Esse cmdlet não retorna nenhuma saída.
Observações
Set-StrictMode
só é eficaz no escopo no qual está definido e em seus escopos filho. Para obter mais informações sobre escopos no PowerShell, consulte about_Scopes.