我正在摸不着头脑,试图弄清楚为什么参数 splatting 不适用于在 Azure 自动化中执行的一组工作流运行手册。
我有 3 个以嵌套方式调用的运行手册(超级、子、子)。它们都(通常)共享相同的参数。在我的真实场景中,我有多个子和子 Runbook,我想使用 splatting,因此我可以定义一个哈希表并根据需要传递它,而不必列出所有参数。
我也尝试过使用该-PSParameterCollection
参数。但是,在 Azure 自动化中,这似乎仅适用于最顶层的 Runbook(已经有效),因为它会在子级中引发参数未找到错误。这里的注释部分说嵌套三层深度的工作流不支持任何公共参数,包括工作流公共参数,这似乎可能是一个问题,具体取决于这些运行手册的编译方式。但我认为我不能在不限制运行手册的可重用性的情况下避免这种情况。我不希望被调用的工作流被编译为调用工作流中的嵌套工作流。
我得到的错误是:
$newnumber = sub @splatter
~~~~~~~~~~
找不到名为“0”的参数。支持的参数有:Debug、ErrorAction、....
奇怪的是,与我在这些测试运行手册中看到的不同,在我的“真实世界”工作流程中,我没有在顶级运行手册中收到此错误 - 仅在从“子”中调用“子”运行手册时.
workflow child
{
Param ([int]$val)
Write-Verbose "child: val ($val)"
$NewNumber = $val*2
$NewNumber
}
workflow childtwo
{
Param ([int]$val, [int]$valtwo)
Write-Verbose "childtwo: val ($val) valtwo ($valtwo)"
$NewNumber = $val * $valtwo
$NewNumber
}
workflow sub
{
Param ([int]$val)
Write-Verbose "sub: val ($val)"
$splatter = @{ val = $val }
# works
$NewNumber = child -val $splatter.val
# fail
$NewNumber = child @splatter
# works
$NewNumber = childtwo -val $splatter.val -valtwo 2
# fail
$NewNumber = childtwo ($splatter + @{ valtwo = 2 })
$mergeSplatter = ($splatter + @{ valtwo = 2 })
$NewNumber = childtwo @mergeSplatter
$twoSplatter = @{ val = $val; valtwo = 2 }
$NewNumber = childtwo @twoSplatter
$NewNumber
}
workflow super
{
Param([int]$val)
Write-Verbose "super: id is $val"
$splatter = @{ val = $val }
$newnumber = sub -val $val
$newnumber = sub @splatter # @ or $ doesn't matter - fails the same
Write-Verbose "super: newnumber is $newnumber"
$newnumber
}
super 2