更新:
经过一番挖掘后,我找到了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"
}
答案 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