无法弄清楚为什么我的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
答案 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
及更高版本不允许。-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脚本。删除代码行后,就为参数设置了值。