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
The variable $a cannot be retrieved because it has not been set yet.
At line:1 char:3
+ $a <<<< -gt 5
+ CategoryInfo : InvalidOperation: (a:Token) [], RuntimeException
+ FullyQualifiedErrorId : VariableIsUndefined
将严格模式设置为版本 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)
The function or command was called like a method. Parameters should be separated by spaces,
as described in 'Get-Help about_Parameter.'
At line:1 char:4
+ add <<<< (3,4)
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : StrictModeFunctionCallWithParens
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
Property 'Month' cannot be found on this object; make sure it exists.
At line:1 char:9
+ $string. <<<< month
+ CategoryInfo : InvalidOperation: (.:OperatorToken) [], RuntimeException
+ FullyQualifiedErrorId : PropertyNotFoundStrict
此命令打开严格模式并将其设置为版本 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']
Index was outside the bounds of the array.
At line:1 char:1
+ $null -eq $a[2]
+ ~~~~~~~~~~~~~~~
+ CategoryInfo : OperationStopped: (:) [], IndexOutOfRangeException
+ FullyQualifiedErrorId : System.IndexOutOfRangeException
Cannot convert value "abc" to type "System.Int32". Error: "Input string was not in a correct format."
At line:1 char:1
+ $null -eq $a['abc']
+ ~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [], RuntimeException
+ FullyQualifiedErrorId : InvalidCastFromStringToInteger
将严格模式设置为版本 3 或更高版本时,无效或超出边界的索引会导致错误。
参数
-Off
指示此 cmdlet 关闭当前范围和所有子作用域的严格模式。
Type: | SwitchParameter |
Position: | Named |
Default value: | None |
Required: | True |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-Version
指定在严格模式下导致错误的条件。 此参数接受任何有效的 PowerShell 版本号。 任何大于 3 的数字都被视为 最新。
此参数的有效值为:
- 1.0
- 禁止引用未初始化的变量,字符串中未初始化的变量除外。
- 2.0
- 禁止引用未初始化的变量。 这包括字符串中的未初始化变量。
- 禁止引用对象的不存在属性。
- 禁止使用语法调用方法的函数调用。
- 3.0
- 禁止引用未初始化的变量。 这包括字符串中的未初始化变量。
- 禁止引用对象的不存在属性。
- 禁止使用语法调用方法的函数调用。
- 禁止超出边界或无法解析的数组索引。
- 最晚
- 选择可用的最新版本。 最新版本最严格。 使用此值可确保脚本使用最严格的可用版本,即使将新版本添加到 PowerShell 也是如此。
注意
在脚本中使用最新版本。 在 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 不返回任何输出。
备注
Set-StrictMode
仅在设置它的作用域及其子作用域中有效。 有关 PowerShell 中作用域的详细信息,请参阅 about_Scopes。