powershell 工作流程 - 不支持参数拼接?

powershell workflow - parameter splatting not supported?

我绞尽脑汁想弄清楚为什么参数展开不适用于在 Azure 自动化中执行的一组工作流运行手册。

我有 3 个以嵌套方式调用的运行手册(超级、子、子)。 它们都共享(通常)相同的参数。在我的真实场景中,我有多个子 runbook 和子 runbook,我想使用 splatting,这样我就可以定义一个哈希表并根据需要传递它,而不必列出所有参数。

我也试过使用 -PSParameterCollection 参数。但是,在 Azure Automation 中,这似乎仅适用于最顶层的 Runbook(已经可以运行),因为它会在子级中抛出参数未找到错误。注释部分 here嵌套三层的工作流不支持任何公共参数,包括工作流公共参数,这似乎是个问题,具体取决于如何这些运行手册是经过编译的……但我认为我无法在不限制运行手册的可重用性的情况下避免这种情况。我不希望被调用的工作流被编译为调用工作流中的嵌套工作流。

我得到的错误是:

$newnumber = sub @splatter
                         ~~~~~~~~~~
Could not find a parameter named '0'. Supported parameters are: Debug, ErrorAction, ....

奇怪的是,与我在这些测试操作手册中看到的不同,在我的 'real-world' 工作流程中,我 没有 在顶级 runbook 中出现此错误 - 仅当从 'sub' 中调用 'child' runbook 时。

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

请参阅https://technet.microsoft.com/en-us/library/jj574140.aspx?f=255&MSPPError=-21472173969:

Splatting is not permitted in workflow activities or in calls to workflows.

您将需要不使用 splatting 或将 PowerShell Workflow runbook 切换到 native PowerShell runbook