Set-StrictMode
Устанавливает и применяет правила написания кода в выражениях, скриптах и блоках скриптов.
Синтаксис
Set-StrictMode
-Version <Version>
[<CommonParameters>]
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
$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 |
Position: | Named |
Default value: | None |
Обязательно: | True |
Принять входные данные конвейера: | False |
Принять подстановочные знаки: | False |
-Version
Указывает условия, вызывающие ошибку в строгом режиме. Этот параметр принимает любой допустимый номер версии PowerShell. Любое число выше 3 рассматривается как последней.
Эффективные значения для этого параметра:
- 1.0
- Запрещает ссылки на неинициализированные переменные, за исключением неинициализированных переменных в строках.
- 2.0
- Запрещает ссылки на неинициализированные переменные. Сюда входят неинициализированные переменные в строках.
- Запрещает ссылки на несуществующие свойства объекта.
- Запрещает вызовы функций, использующие синтаксис для вызова методов.
- 3.0
- Запрещает ссылки на неинициализированные переменные. Сюда входят неинициализированные переменные в строках.
- Запрещает ссылки на несуществующие свойства объекта.
- Запрещает вызовы функций, использующие синтаксис для вызова методов.
- Запретить ограничения или неразрешенные индексы массива.
- Самый поздний
- Выбирает последнюю версию. Последняя версия является самой строгой. Используйте это значение, чтобы убедиться, что скрипты используют строгую доступную версию, даже если новые версии добавляются в PowerShell.
Осторожность
Использование версиипоследних в сценариях. Смысл последних может измениться в новых выпусках PowerShell. Поэтому скрипт, написанный для более старой версии PowerShell, использующая Set-StrictMode -Version Latest
, применяется к более строгим правилам при запуске в более новой версии PowerShell.
Тип: | Version |
Aliases: | v |
Position: | Named |
Default value: | None |
Обязательно: | True |
Принять входные данные конвейера: | False |
Принять подстановочные знаки: | False |
Входные данные
None
Входные данные в этот командлет невозможно передать.
Выходные данные
None
Этот командлет не возвращает выходные данные.
Примечания
Set-StrictMode
действует только в области, в которой она задана, и в ее дочерних областях. Дополнительные сведения о областях в PowerShell см. в about_Scopes.