无法弄清楚为什么我的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
您已经说过,Mule作为调用PowerShell的环境是该问题的附带环境。
症状-错误变量'
-版本1
仍然允许在可扩展字符串中未设置变量(例如,“$noSuchVar”
),但-版本2
及更高版本不允许-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 脚本。删除代码行后,参数被设置为值。