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。