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 启用严格模式

如果严格模式设置为 关闭,则无效或超出边界索引的结果返回 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 对当前作用域和所有子范围关闭严格模式。

类型:SwitchParameter
Position:Named
默认值:None
必需:True
接受管道输入:False
接受通配符: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 编写的脚本受限制性更高的规则的约束。

类型:Version
别名:v
Position:Named
默认值:None
必需:True
接受管道输入:False
接受通配符:False

输入

None

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

输出

None

此 cmdlet 不返回任何输出。

备注

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

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