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


Set-StrictMode

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

Синтаксис

Version (По умолчанию)

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

Off

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

Описание

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

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

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."
$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

Если для строгого режима задано значение 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']
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

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

Свойства параметров

Тип:SwitchParameter
Default value:None
Поддерживаются подстановочные знаки:False
DontShow:False

Наборы параметров

Off
Position:Named
Обязательно:True
Значение из конвейера:False
Значение из конвейера по имени свойства:False
Значение из оставшихся аргументов:False

-Version

Указывает условия, вызывающие ошибку в строгом режиме. Этот параметр принимает любой допустимый номер версии PowerShell. Любое число, превышающее 3, рассматривается как Latest. Указанное значение должно быть строковым Latest или строкой, которую можно преобразовать в тип System.Version. Версия должна соответствовать допустимой версии PowerShell.

Эффективные значения для этого параметра:

  • 1.0
    • Запрещает ссылки на неинициализированные переменные, за исключением неинициализированных переменных в строках.
  • 2.0
    • Запрещает ссылки на неинициализированные переменные. Сюда входят неинициализированные переменные в строках.
    • Запрещает ссылки на несуществующие свойства объекта.
    • Запрещает вызовы функций, использующие синтаксис для вызова методов.
  • 3.0
    • Запрещает ссылки на неинициализированные переменные. Сюда входят неинициализированные переменные в строках.
    • Запрещает ссылки на несуществующие свойства объекта.
    • Запрещает вызовы функций, использующие синтаксис для вызова методов.
    • Запретить ограничения или неразрешенные индексы массива.
  • Latest
    • Выбирает последнюю версию. Последняя версия является самой строгой. Используйте это значение, чтобы убедиться, что скрипты используют строгую доступную версию, даже если новые версии добавляются в PowerShell.

Осторожность

Использование Latest для версии в сценариях не является детерминированным. Смысл Latest может измениться в новых выпусках PowerShell. Скрипт, написанный для более старой версии PowerShell, использующий Set-StrictMode -Version Latest, применяется к более строгим правилам при запуске в более новой версии PowerShell.

Свойства параметров

Тип:Version
Default value:None
Поддерживаются подстановочные знаки:False
DontShow:False
Aliases:в

Наборы параметров

Version
Position:Named
Обязательно:True
Значение из конвейера:False
Значение из конвейера по имени свойства:False
Значение из оставшихся аргументов:False

CommonParameters

Этот командлет поддерживает общие параметры: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutBuffer, -OutVariable, -PipelineVariable, -ProgressAction, -Verbose, -WarningAction и -WarningVariable. Дополнительные сведения см. в разделе about_CommonParameters.

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

None

Невозможно передать объекты в этот командлет.

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

None

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

Примечания

Хотя параметр версии принимает значения больше 3.0, дополнительные правила не определены для чего-либо выше, чем 3.0.

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