Set-StrictMode

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

语法

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

说明

cmdlet Set-StrictMode 为当前范围和所有子范围配置严格模式,并打开和关闭该模式。 启用严格模式时,当表达式、脚本或脚本块的内容违反基本最佳做法编码规则时,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.

将严格模式设置为 version 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 打开

将严格模式设置为 “关”时,无效或超出边界的索引结果返回 null 值。

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

True
True

Set-StrictMode -Version 3
$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 也是如此。

注意

在脚本中使用 的版本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的值,但Set-StrictMode目前没有为高于 3.0的任何内容定义其他规则。

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