我正在部署一个在事件网格上触发的逻辑应用程序。部署后,我需要验证API连接。我发现这个脚本https://github.com/logicappsio/LogicAppConnectionAuth,它工作正常。但只有我从Powershell手动运行它。但我想在New-AzResourceGroupDeployment命令之后从另一个脚本调用该脚本,该脚本来自部署Logic App的脚本。
这样做不起作用。我收到错误:
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变量?它没有在脚本中定义,单独运行时仍然存在,但是当我从另一个脚本运行脚本时却不存在。
作为you've discovered,在您的具体情况下,问题是由于调用者启用严格模式而出现的通常是良性错误。但是,问题是一个基本问题,如下所述。
根本问题是,从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>
未来展望:
This RFC建议引入词法范围的严格模式以避免当前行为的问题。
好像$ scope变量有一些复制粘贴错误。它不会在任何地方声明,设置或读取。在StrictMode 3中运行调用脚本是导致错误的原因。删除它,删除错误,但这不是一个真正的解决方案。
我向github repo发布了一个问题,并通过将$ scope变量声明为空字符串来修复我自己的解决方案。