Set-StrictMode

建立并强制执行表达式、脚本和脚本块中的编码规则。

语法

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

说明

Set-StrictMode cmdlet 可为当前作用域以及所有子作用域配置严格模式,并启用和禁用该模式。 启用严格模式时,如果表达式、脚本或脚本块的内容违反了基本的最佳实践编码规则,则 PowerShell 将生成终止错误。

使用 Version 参数可确定要强制执行的编码规则。

Set-PSDebug -Strict cmdlet 为全局作用域启用严格模式。 Set-StrictMode 仅影响当前作用域及其子作用域。 然后,可以在脚本或函数中使用它来替代从全局作用域继承的设置。

Set-StrictMode 关闭时,PowerShell 具有以下行为:

  • 假定未初始化的变量具有 0(零)或 $Null 值,具体取决于类型
  • 对不存在的属性的引用将返回 $Null
  • 不适当的函数语法的结果因错误情况而异
  • 尝试使用数组中无效的索引来检索值将返回 $Null

示例

示例 1:启用版本 1.0 的严格模式

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

False

Set-StrictMode -Version 1.0
$a -gt 5

InvalidOperation: The variable '$a' cannot be retrieved because it has not been set.

如果严格模式设置为版本 1.0,则尝试引用未初始化的变量将失败。

示例 2:启用版本 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)

InvalidOperation: The function or command was called as if it were a method. Parameters should be separated by spaces. For information about parameters, see the about_Parameters Help topic.

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

True

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

PropertyNotFoundException: The property 'Month' cannot be found on this object. Verify that the property exists.

此命令启用严格模式并将其设置为版本 2.0。 因此,如果对函数调用使用了方法语法(使用括号和逗号),或引用了未初始化的变量或不存在的属性,则 PowerShell 将返回错误。

该示例输出显示版本 2.0 严格模式的效果。

如果不使用版本 2.0 严格模式,则 (3,4) 值将解释为未向其中添加任何值的单个数组对象。 如果使用版本 2.0 严格模式,则它将正确地解释为用于提交两个值的错误语法。

如果不使用版本 2.0,则对字符串的不存在的 Month 属性的引用仅返回 $Null。 如果使用版本 2.0,则它将正确地解释为一个引用错误。

示例 3:启用版本 3.0 的严格模式

如果严格模式设置为 Off,则无效或超出边界的索引结果将返回 null 值。

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

True
True

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

OperationStopped: Index was outside the bounds of the array.

InvalidArgument: Cannot convert value "abc" to type "System.Int32". Error: "Input string was not in a correct format."

如果严格模式设置为版本 3 或更高版本,无效或超出边界的索引会导致错误。

参数

-Off

指示此 cmdlet 对当前作用域和所有子作用域禁用严格模式。

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

-Version

指定在严格模式下导致错误的条件。 此参数接受任何有效的 PowerShell 版本号。 高于 3 的任何数字都被视为 Latest。 提供的值必须是字符串 Latest 或可以转换为 System.Version 类型的字符串。 版本必须与有效的 PowerShell 版本匹配。

此参数的有效值为:

  • 1.0
    • 除了字符串中未初始化的变量以外,禁止对其他未初始化的变量的引用。
  • 2.0
    • 禁止引用未初始化的变量。 这包括字符串中未初始化的变量。
    • 禁止引用对象的不存在的属性。
    • 禁止那些将该语法用于调用方法的函数调用。
  • 3.0
    • 禁止引用未初始化的变量。 这包括字符串中未初始化的变量。
    • 禁止引用对象的不存在的属性。
    • 禁止那些将该语法用于调用方法的函数调用。
    • 禁止超出边界或无法解析的数组索引。
  • Latest
    • 选择可用的最新版本。 最新版本最严格。 使用此值可确保脚本使用最严格的可用版本,即使当新版本添加到 PowerShell 也是如此。

注意

在脚本中为 Version 使用 Latest 并不是确定性的。 在 PowerShell 的新版本中,Latest 的含义可能会发生变化。 在较新版本的 PowerShell 中运行时,为使用 Set-StrictMode -Version Latest 的旧版 PowerShell 编写的脚本受限制性更高的规则约束。

Type:Version
Aliases:v
Position:Named
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

输入

None

不能通过管道将对象传递给此 cmdlet。

输出

None

此 cmdlet 不返回任何输出。

备注

虽然 Version 参数接受大于 3.0 的值,但不存在为高于 3.0 的任何内容定义的其他规则。

Set-StrictMode 仅在其设置的作用域及其子作用域中有效。 有关 PowerShell 中的作用域的详细信息,请参阅 about_Scopes