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

时间:2016-01-29 01:25:33

标签: powershell azure azure-automation powershell-workflow

我正在试图弄清楚为什么参数splatting不适用于Azure自动化中执行的一组工作流程表。

我有3个以嵌套方式调用的Runbook(super,sub,child)。 它们都共享(通常)相同的参数。在我的真实场景中,我有多个子&子Runbook我想使用splatting所以我可以定义一个哈希表并根据需要传递它,而不必列出所有的参数。

我也尝试过使用-PSParameterCollection参数。但是,在Azure自动化中,这似乎只适用于最顶层的Runbook(已经可以使用),因为它会在子节点中为它抛出一个参数not found错误。注意部分here表示嵌套三层深度的工作流不支持任何常见参数,包括工作流常用参数,这似乎可能是一个问题,具体取决于这些Runbook的工作方式编译..但我不认为我可以避免这种情况而不限制Runbook的可重用性。我不希望被调用的工作流程被编译为调用工作流程中的嵌套工作流程。

我得到的错误是:

  

$ newnumber = sub @splatter
  ~~~~~~~~~~
  找不到名为“0”的参数。支持的参数有:Debug,ErrorAction,....

奇怪的是,与我在这些测试版本中看到的不同,在我的“真实世界”工作流程中,我 在顶部出现此错误-level 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

1 个答案:

答案 0 :(得分:1)

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

  

工作流程活动或工作流程调用中不允许使用Splatting。

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