Как я могу объединить set-strictMode -version 2 в скрипте PowerShell (не функции) с оператором param? - PullRequest
1 голос
/ 15 марта 2020

Когда я запускаю следующий скрипт, я получаю Переменная '$ windowHeight' не может быть получена, потому что она не была установлена. сообщение об ошибке.

set-strictMode -version 2

param (
  [parameter(Mandatory=$false)] [Int32] $windowHeight,
  [parameter(Mandatory=$false)] [Int32] $windowWidth
)

echo "windowHeight: $windowHeight"
echo "windowWidth:  $windowWidth"

Это сообщение об ошибке уходит, если я удалю оператор set-strictMode.

Возможно ли как-то использовать set-strictMode -version 2 вместе с оператором param, не получая сообщения об ошибке?

Ответы [ 2 ]

1 голос
/ 15 марта 2020

Чтобы уточнить полезный ответ Герта Яна Краайевельда :

A param(...) блок должен быть первым оператором в скрипте (или функции) для работы - со следующими ограниченными исключениями :

  • в v5 +, using операторам может предшествовать - см. about_using.

  • комментарии могут предшествовать этому,

    • , который включает #Requires комментариев, которые требования к состоянию оценены / обеспечены до запуска сценария - см. about_Requires

Возможно, размещение любых других операторов перед param(...) должно быть перехвачено во время разбора , но в PowerShell 7.0 ошибка возникает во время выполнения , что может привести к бесполезным сообщениям об ошибках:

Технически происходит то, что команда, ошибочно помещенная перед блоком param(...), изменяет интерпретацию последнего на рассмотрение param имени команда (псевдоним, функция, сценарий или исполняемый файл) - которого обычно не существует.

Поскольку в вашем случае неуместная команда была вызовом Set-StrictMode, аргументы к команде-не-команде были оценены первыми, а ссылка на несуществующую $windowHeight (которая тогда не рассматривалась как переменная параметр ) вызвала строгую ошибка -режима, которую вы видели.

Если бы вы сначала поместили другую команду, неверная интерпретация param как имени команды стала бы более очевидной:

The term 'param' is not recognized as the name of a cmdlet, function, script file, or operable program. [...]

Хотя это лучше, чем вводящая в заблуждение ошибка строгого режима, как указано, ошибка времени разбора с выделенным , специфицирующим c сообщение об ошибке будет намного лучше.

1 голос
/ 15 марта 2020

Параметр param должен стоять первым. Поэтому переместите строку Set-StrictMode на несколько строк вниз. Тогда это работает. Сделайте параметры обязательными, если вы хотите, чтобы они всегда указывались

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...