更改工作流的SerializationMethod

时间:2016-06-10 14:10:26

标签: powershell azure azure-powershell azure-resource-manager

更新:

经过一番挖掘后,我找到了Update-TypeData的页面,其中有一个方法可以说明:

  

-SerializationMethod
  String:将类型序列化为字符串。您可以使用StringSerializationSource指定要用作序列化结果的类型的属性。否则,使用对象的ToString方法序列化类型。

这似乎是我遇到的问题,但我无法在工作流程中运行Update-TypeData

原始问题

我有以下代码:

workflow Deploy-Template
{
    Param
    (
        $Credentials, $resourcegroup, $count
    )
    $PSDisableSerializationPreference = $true
    $results = @() 

    $collection = (1..$count) 
    sequence
    {

        foreach -parallel ($item in $collection)
        {
            $subs = Add-AzureRmAccount -Credential $Credentials

            $deploy = New-AzureRmResourceGroupDeployment -Name ([guid]::NewGuid()).guid.tostring() `
                                                    -ResourceGroupName $resourcegroup `
                                                    -TemplateFile "E:\tmp\storage.json"
            $obj= New-Object -type PSObject -Property  @{ 
            output = $deploy
            }
            $workflow:results += $obj
        }
        Write-Output $results 
    }
}

$value = Deploy-Template -Credentials $TenantObject.credential -resourcegroup $resourcegroup -count 1

当我运行它并尝试查询结果时,我得到:

PS > $value[0].output.Outputs.storageAccountName
Microsoft.Azure.Commands.ResourceManager.Cmdlets.SdkModels.DeploymentVariable


PS > $value[0].output.Outputs.storageAccountName | gm 
TypeName: System.String

我已经四处寻找并改变了一些事情,似乎在Workflow $deploy内运行时,DeploymentVariable成为string

如果我刚跑:

$deploy = New-AzureRmResourceGroupDeployment -Name ([guid]::NewGuid()).guid.tostring() `
                                        -ResourceGroupName $resourcegroup `
                                        -TemplateFile "E:\tmp\storage.json"

我明白了:

PS > $deploy.Outputs.storageAccountName.Value 
y74ek7r67mq6c

这是我所期待的。 (在value

中运行时没有workflow属性

我尝试通过convertto-json运行它,但它也是这样做的。

为什么我无法将我的对象从我的工作流程中删除?

已修改以添加

storage.json文件的相关部分是

"outputs": {
    "storageAccountName": {
        "type": "string",
        "value": "[variables('storageAccount')]"

workflow

之外跑
$deploy.Outputs.storageAccountName.GetType()
  

IsPublic IsSerial Name BaseType
  -------- -------- ---- --------
  True False DeploymentVariable System.Object

workflow内部提供

$value[0].output.Outputs.storageAccountName.gettype()
  

IsPublic IsSerial Name BaseType
  -------- -------- ---- --------
  True True String System.Object

以内联方式运行代码会产生相同的结果

$deploy = InlineScript
{
  New-AzureRmResourceGroupDeployment -Name ([guid]::NewGuid()).guid.tostring() `
                                        -ResourceGroupName $Using:resourcegroup `
                                        -TemplateFile "E:\Git\Simplifed-Azure-Templates\storage.json"
}

1 个答案:

答案 0 :(得分:1)

Objects in workflows are deserialized

  

当您需要运行一个或多个时,InlineScript活动非常有用   命令作为传统的PowerShell脚本而不是PowerShell   流程。将工作流中的命令发送到Windows Workflow   处理InlineScript块中的命令的基础是   由Windows PowerShell处理。

来源是以上链接。

您可能需要将调用包装在InlineScript

  

您可以通过将输出分配给a来返回InlineScript的输出   变量

试试这个:

workflow Deploy-Template
{
    Param
    (
        $Credentials, $resourcegroup, $count
    )
    $PSDisableSerializationPreference = $true
    $results = @() 


    $collection = (1..$count) 
    sequence
    {

        foreach -parallel ($item in $collection)
        {
            $workflow:results += InlineScript {
                $subs = Add-AzureRmAccount -Credential $Credentials

                $deploy = New-AzureRmResourceGroupDeployment -Name ([guid]::NewGuid()).guid.tostring() `
                                                        -ResourceGroupName $resourcegroup `
                                                        -TemplateFile "E:\tmp\storage.json"
                New-Object -type PSObject -Property  @{ 
                    output = $deploy
                }
            }
        }
        Write-Output $results 
    }
}

$value = Deploy-Template -Credentials $TenantObject.credential -resourcegroup $resourcegroup -count 1