Почему этот скрипт работает только при запуске непосредственно из powershell, но не из другого скрипта - PullRequest
0 голосов
/ 12 февраля 2019

Я развертываю приложение логики, которое запускается в сетке событий.После развертывания мне нужно аутентифицировать соединение API.Я нашел этот скрипт https://github.com/logicappsio/LogicAppConnectionAuth, и он отлично работает.Но только если я запускаю его вручную из Powershell.Но я хочу вызвать этот скрипт из другого скрипта, из того, который развертывает приложение логики, после команды New-AzResourceGroupDeployment.

Это не работает.Я получаю ошибку:

The variable '$Scope' cannot be retrieved because it has not been set.
At C:\location\LogicAppConnectionAuth.ps1:16 char:113
+ ... Browser -Property @{Width=580;Height=780;Url=($url -f ($Scope -join " ...
+                                                            ~~~~~~
    + CategoryInfo          : InvalidOperation: (Scope:String) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : VariableIsUndefined

Что это за переменная $ scope?Он не определен в сценарии, тем не менее он существует при запуске отдельно, но не при запуске сценария из другого сценария.

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

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


Основная проблема заключается в том, что, начиная с v6.2, строгий режим PowerShell динамически ограничен,не лексически .

Это означает, что использование Set-StrictMode влияет не только на функцию или скрипт, в котором она называется , но также другие функции и скрипты, вызываемые из той функции или сценария , которые живут в одном и том же домене области , то есть если и вызывающий, и вызываемый абоненты определены вне модуля или определено в том же модуле.

Другими словами: Сценарий или функция может невольно наследовать настройку строгого режимаи может сломаться , если он не предназначен для этого режима.

Например, вызываемый абонент может предположить, что строгий режим установлен по умолчанию, -Off, иполагаться (свободно) на тестирование несуществования переменной $var с if (-not $var), например.Если для вызывающего абонента в том же домене области установлено значение Set-StrictMode -Version 1 или выше, вызываемый абонент прервет.

Обходные пути :

  • Если вы управляете вызываемым скриптом или функцией :

    • Явно вызовите Set-StrictMode в начале вашего скрипта или функции с режимом, для которого разработан ваш код.

      • Учитывая описанное поведение, стоит сделать это по привычке в немодульных скриптах и ​​функциях.
    • Примечание: имейте в виду, что этот режим также действует для сценариев / функций в той же области действия, которые вызываются изнутри сценария или функции, а также скрипты / функции они вызывают.(Напротив, код выше до стека вызовов не влияет).

  • В противном случае :

    • Временно отключить строгий режим , чтобы вызвать скрипт или функцию, которая ожидает, что строгий режим отключен (или в более низкой версии):

      # Temporarily turn strict mode off.
      Set-StrictMode -Off
      
      # Call the script or function that breaks with (a higher) strict mode in effect
      ...
      
      # Re-enable strict mode for your code.
      # Note that there's no way to *get* (and save for later restoring)
      # the specific mode in effect.
      Set-StrictMode -Version <n> 
      

Перспективы на будущее :

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

0 голосов
/ 12 февраля 2019

Похоже, что переменная $ scope существует из-за ошибки копирования-вставки.Он нигде не объявлен, не установлен и не прочитан.Запуск вызывающего скрипта в StrictMode 3 является причиной ошибки.Удаление этого, удаляет ошибку, но на самом деле это не решение.

Я опубликовал проблему в репозитории github и исправил свое собственное решение, просто объявив переменную $ scope как пустую строку.

...