Compartir a través de


Set-StrictMode

Establece y aplica reglas de codificación en expresiones, scripts y bloques de script.

Syntax

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

Description

El Set-StrictMode cmdlet configura el modo strict para el ámbito actual y todos los ámbitos secundarios, y lo activa y desactiva. Cuando el modo strict está activado, PowerShell genera un error de terminación cuando el contenido de una expresión, script o bloque de script infringe las reglas básicas de codificación de procedimientos recomendados.

Use el parámetro Version para determinar qué reglas de codificación se aplican.

Set-PSDebug -Strict el cmdlet activa el modo estricto para el ámbito global. Set-StrictMode afecta solo al ámbito actual y a sus ámbitos secundarios. Por lo tanto, puede usarlo en un script o una función para invalidar la configuración heredada del ámbito global.

Cuando Set-StrictMode está desactivado, PowerShell tiene los siguientes comportamientos:

  • Se supone que las variables no inicializadas tienen un valor de 0 (cero) o $Null, según el tipo.
  • Las referencias a propiedades inexistentes devuelven $Null
  • Los resultados de la sintaxis de función incorrecta varían con las condiciones de error
  • Si se intenta recuperar un valor mediante un índice no válido en una matriz, se devuelve $Null

Ejemplos

Ejemplo 1: Activar el modo estricto como versión 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 el modo strict establecido en la versión 1.0, se intenta hacer referencia a variables que no se inicializan con errores.

Ejemplo 2: Activar el modo estricto como versión 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

Este comando activa el modo strict y lo establece en la versión 2.0. Como resultado, PowerShell devuelve un error si usa la sintaxis de método, que usa paréntesis y comas, para una llamada de función o hacer referencia a variables no inicializadas o propiedades inexistentes.

La salida de ejemplo muestra el efecto del modo strict de la versión 2.0.

Sin el modo strict de la versión 2.0, el valor "(3.4)" se interpreta como un objeto de matriz único al que no se agrega nada. Mediante el modo estricto de la versión 2.0, se interpreta correctamente como sintaxis incorrecta para enviar dos valores.

Sin la versión 2.0, la referencia a la propiedad Month inexistente de una cadena devuelve solo $Null. Mediante la versión 2.0, se interpreta correctamente como un error de referencia.

Ejemplo 3: Activar el modo estricto como versión 3.0

Con el modo strict establecido en Desactivado, los índices no válidos o fuera de los límites devuelven valores 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 el modo strict establecido en la versión 3 o posterior, los índices no válidos o fuera de los límites producen errores.

Parámetros

-Off

Indica que este cmdlet desactiva el modo estricto para el ámbito actual y todos los ámbitos secundarios.

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

-Version

Especifica las condiciones que provocan un error en modo strict. Este parámetro acepta cualquier número de versión de PowerShell válido. Cualquier número mayor que 3 se trata como Latest.

Los valores efectivos de este parámetro son:

  • 1.0
    • Prohíbe las referencias a variables no inicializadas, excepto las variables no inicializadas en cadenas.
  • 2.0
    • Prohíbe las referencias a variables no inicializadas. Esto incluye variables no inicializadas en cadenas.
    • Prohíbe las referencias a propiedades inexistentes de un objeto.
    • Prohíbe las llamadas de función que usan la sintaxis para llamar a métodos.
  • 3.0
    • Prohíbe las referencias a variables no inicializadas. Esto incluye variables no inicializadas en cadenas.
    • Prohíbe las referencias a propiedades inexistentes de un objeto.
    • Prohíbe las llamadas de función que usan la sintaxis para llamar a métodos.
    • Prohibir los límites o los índices de matriz irresolubles.
  • Más reciente
    • Selecciona la versión más reciente disponible. La versión más reciente es la más estricta. Use este valor para asegurarse de que los scripts usan la versión más estricta disponible, incluso cuando se agregan nuevas versiones a PowerShell.
Type:Version
Aliases:v
Position:Named
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

Entradas

None

No se puede canalizar la entrada a este cmdlet.

Salidas

None

Este cmdlet no genera resultados de ningún tipo.

Notas

Set-StrictMode solo es efectivo en el ámbito en el que se establece y en sus ámbitos secundarios. Para obtener más información sobre los ámbitos en PowerShell, consulte about_Scopes.