Поделиться через


Set-StrictMode

Устанавливает и применяет правила кодирования в выражениях, сценариях и блоках сценариев.

Синтаксис

Set-StrictMode
   -Version <Version>
   [<CommonParameters>]
Set-StrictMode
   [-Off]
   [<CommonParameters>]

Описание

Командлет Set-StrictMode настраивает строгий режим для текущего область и всех дочерних областей, а также включает и отключает его. Если включен строгий режим, PowerShell создает устранимую ошибку, если содержимое выражения, скрипта или блока скрипта нарушает основные правила написания кода.

Используйте параметр Version , чтобы определить, какие правила кодирования применяются.

Set-PSDebug -StrictКомандлет включает строгий режим для глобального область. 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

Указывает, что этот командлет отключает строгий режим для текущей область и всех дочерних областей.

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

В этот командлет нельзя передать входные данные.

Выходные данные

None

Этот командлет не возвращает никакие выходные данные.

Примечания

Set-StrictModeдействует только в область, в котором он задан, и в дочерних областях. Дополнительные сведения об областях в PowerShell см. в разделе about_Scopes.