【问题标题】:powershell workflow - parameter splatting not supported?powershell 工作流程 - 不支持参数飞溅?
【发布时间】:2016-03-09 01:31:59
【问题描述】:

我正在挠头,试图弄清楚为什么在 Azure 自动化中执行的一组工作流运行手册无法使用参数分解。

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

我也尝试过使用-PSParameterCollection 参数。但是,在 Azure 自动化中,这似乎仅适用于最顶层的 Runbook(已经有效),因为它会在子级中引发参数未找到错误。注释部分here嵌套三层深度的工作流不支持任何常用参数,包括工作流常用参数,这似乎是个问题,具体取决于这些运行手册的编译方式。 .但我认为我不能在不限制运行手册的可重用性的情况下避免这种情况。我不希望被调用的工作流被编译为调用工作流中的嵌套工作流。

我得到的错误是:

$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

【问题讨论】:

  • child @splatter,不是child $splatter

标签: powershell azure azure-automation powershell-workflow


【解决方案1】:

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

在工作流活动或对工作流的调用中不允许喷溅。

您需要不使用 splatting 或将 PowerShell 工作流运行手册切换到 native PowerShell runbook

【讨论】:

  • 谢谢乔,很明显;-x。但这很奇怪,在我的真实场景中,它似乎可以工作或忽略它,因为它没有抛出错误。我只能推测,但也许这与脚本的编译方式有关(自下而上?),是否存在不同的编译阶段会引发不同类型的错误?在我解决了这个似乎是“运行时”问题的问题后,我开始收到“相关脚本编译”错误。现在一切都解决了,谢谢!
  • 更多背景知识:这些最初是本机 PS,现在正在转换(尽可能简单)为工作流活动,以便并行运行它们(至少,比开始新的更容易)工作和轮询输出)。因为有一些运行手册都接受大部分相同的参数集,所以我只是试图减少它们以尽可能减少重复代码:)
猜你喜欢
  • 1970-01-01
  • 2021-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-28
  • 2018-12-04
  • 2020-07-16
相关资源
最近更新 更多