为什么此脚本仅在直接从powershell运行时才起作用,而不是从另一个脚本运行

问题描述 投票:1回答:2

我正在部署一个在事件网格上触发的逻辑应用程序。部署后,我需要验证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变量?它没有在脚本中定义,单独运行时仍然存在,但是当我从另一个脚本运行脚本时却不存在。

powershell scoping strict
2个回答
1
投票

作为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建议引入词法范围的严格模式以避免当前行为的问题。


0
投票

好像$ scope变量有一些复制粘贴错误。它不会在任何地方声明,设置或读取。在StrictMode 3中运行调用脚本是导致错误的原因。删除它,删除错误,但这不是一个真正的解决方案。

我向github repo发布了一个问题,并通过将$ scope变量声明为空字符串来修复我自己的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.