Mule PowerShell连接器-无法检索变量'$ <变量名称>',因为尚未设置

时间:2018-07-18 20:31:06

标签: powershell mule anypoint-studio mule-esb

无法弄清楚为什么我的PowerShell脚本中的变量总是说变量为空(错误:由于未设置变量'$',因此无法检索。

M流= HTTP->设置有效载荷-> PowerShell->记录器->结束

〜MULE XML代码段-使用PowerShell Connector 3.x版本〜

<powershell:execute config-ref="PowerShell" doc:name="PowerShell" scriptFile="classpath:powershell-script.ps1">
   <powershell:parameters>
     <powershell:parameter key="variable1">#[groovy: payload.variable1 ?: '']</powershell:parameter>
     <powershell:parameter key="variable2">#[groovy: payload.variable2 ?: '']</powershell:parameter>
     <powershell:parameter key="variable3">#[groovy: payload.variable3 ?: '']</powershell:parameter>
   <powershell:parameters>
<powershell:execute>

〜PowerShell代码〜

Set-StrictMode -Version Latest 
Param($variable1, $variable2, $variable3)

#Create NEW AD accounts
Function Start-Commands
{
  Write-Output "Start-Commands"
  Write-Output "Parameters-: $variable1 - $variable2 - $variable3"
}

Start-Commands

〜控制台输出〜

  

根异常堆栈跟踪:   org.mule.modules.powershell.PowershellException:无法发送消息。已引发异常:[{“ Exception”:“ System.Management.Automation.RuntimeException:无法检索变量'$ flowVarManager',因为尚未设置。\ r \ n

2 个答案:

答案 0 :(得分:1)

从那以后,您已经说过,作为调用PowerShell的环境的Mule与问题是偶然的。

症状-错误The variable '<name>' cannot be retrieved because it has not been set.-实际上表示正在访问 且从未进行 set (初始化)的变量,并且这种错误是仅在Set-StrictMode -Version 1或更高版本有效时提高。

  • -Version 1仍允许在可扩展字符串中使用未设置的变量(例如"$noSuchVar"),但-Version 2及更高版本不允许。
    可以公平地假设您不在PowerShell v1上(其中-Version Latest表示-Version 1),因此对在执行过程中遇到的未设置变量的 any 引用将触发错误。

但是,PowerShell 隐式管理(作为param(...)块的一部分)的 parameter 变量不受{em> {3}}检查,如以下示例所示:

PS> Set-StrictMode -Version Latest; & { param($paramVar1) "[$paramVar1]" }
[]

注意:& { ... }使用调用操作符&执行脚本块 { ... },但是这种脚本块的行为与一个脚本。

如您所见,即使没有参数传递给参数-paramVar1-即没有值绑定到基础$paramVar1 参数变量-访问{{1 }}导致没有导致错误,评估为$paramVar1,该错误在字符串插值的情况下成为空字符串

通过引用真正的未设置变量对此进行对比:

$null

由于从未设置PS> Set-StrictMode -Version Latest; & { param($paramVar1) "[$somveVar]" } The variable '$somveVar' cannot be retrieved because it has not been set. (并且它不是参数变量),因此触发了错误。

因此,在撰写本文时,我们可以观察到有关问题中印刷的代码的以下内容,

$someVar
  • 首先,不能将# NOTE: This code is syntactically invalid due to the placement # of the Set-StrictMode call. Set-StrictMode -Version Latest Param($variable1, $variable2, $variable3) #Create NEW AD accounts Function Start-Commands { Write-Output "Start-Commands" Write-Output "Parameters-: $variable1 - $variable2 - $variable3" } Start-Commands 调用放置在Set-StrictMode块的上方,因为后者必须是 first 语句中的脚本。

  • 其次,鉴于错误消息抱怨一个名为param(...)的变量,并且该代码没有对该变量的任何引用,因此引用的代码单独不能是问题的根源。

答案 1 :(得分:-1)

为解决此问题,我删除了 Set-StrictMode -Version Latest

根据我的研究,我发现了这篇文章-> https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/set-strictmode?view=powershell-6

  

Set-StrictMode cmdlet为当前作用域和所有子作用域配置严格模式,并将其打开和关闭。启用严格模式后,当表达式,脚本或脚本块的内容违反基本的最佳实践编码规则时,Windows PowerShell会生成终止错误。

当Set-StrictMode设置为ON时,它会干扰将参数值从MS PowerShell连接器-Mule 3传递到PS脚本。删除代码行后,就为参数设置了值。