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."
$string.Month -eq $null

True

Set-StrictMode -Version 2.0
$string = "This is a string."
$string.Month -eq $null

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)
$a[2] -eq $null
$a['abc'] -eq $null

True
True

Set-StrictMode -Version 3
$a = @(1)
$a[2] -eq $null
$a['abc'] -eq $null

Index was outside the bounds of the array.
At line:1 char:1
+ $a[2] -eq $null
+ ~~~~~~~~~~~~~~~
    + 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
+ $a['abc'] -eq $null
+ ~~~~~~~~~~~~~~~~~~~
    + 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 也是如此。
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