提问者:小点点

Mule PowerShell 连接器 - 无法检索变量“$<variable-name>”,因为它尚未设置


无法弄清楚为什么我的PowerShell脚本中的变量一直说该变量为空(错误:无法检索变量“$”,因为它尚未设置。)

骡子流 = HTTP --

~ 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个答案

匿名用户

您已经说过,Mule作为调用PowerShell的环境是该问题的附带环境。

症状-错误变量'

  • -版本1仍然允许在可扩展字符串中未设置变量(例如,“$noSuchVar”),但-版本2及更高版本不允许
    可以公平地假设您不在PowerShell v1上(其中-Version Latest意味着-Version 1),因此在执行过程中遇到的任何对未设置变量的引用都会触发错误

但是,PowerShell 隐式管理的参数变量(作为 param(...) 块的一部分)不受 Set-StrictMode 检查的约束,如以下示例所示:

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

注意:

如您所见,即使没有参数被传递给参数-参数Var1-即,没有值被绑定到底层$参数Var1参数变量-访问$参数Var1没有导致错误,评估为$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 调用不能放在 param(...) 块之上,因为后者必须是脚本中的第一个语句。

    第二,假设错误消息抱怨一个名为< code>$flowVarManager的变量,并且假设代码没有对该变量进行任何引用,那么引用的代码本身不可能是问题的根源。

  • 匿名用户

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

    根据我的研究,我发现了这篇文章——

    设置严格模式 cmdlet 为当前作用域和所有子作用域配置严格模式,并将其打开和关闭。当严格模式处于打开状态时,当表达式、脚本或脚本块的内容违反基本的最佳做法编码规则时,Windows PowerShell 会生成终止错误。

    当 Set-StrictMode 处于打开状态时,它会干扰将参数值从 MS PowerShell 连接器 - Mule 3 传递到 PS 脚本。删除代码行后,参数被设置为值。

    相关问题