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 对当前作用域和所有子作用域禁用严格模式。
类型: | SwitchParameter |
Position: | Named |
默认值: | None |
必需: | True |
接受管道输入: | False |
接受通配符: | 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 编写的脚本受限制性更高的规则约束。
类型: | Version |
别名: | v |
Position: | Named |
默认值: | None |
必需: | True |
接受管道输入: | False |
接受通配符: | False |
输入
None
不能通过管道将对象传递给此 cmdlet。
输出
None
此 cmdlet 不返回任何输出。
备注
虽然 Version 参数接受大于 3.0
的值,但不存在为高于 3.0
的任何内容定义的其他规则。
Set-StrictMode
仅在其设置的作用域及其子作用域中有效。 有关 PowerShell 中的作用域的详细信息,请参阅 about_Scopes。