Powershell 在Azure Automation中未将哈希表读取为哈希表

Powershell 在Azure Automation中未将哈希表读取为哈希表,powershell,azure,Powershell,Azure,我们有一段代码可以在Powershell ISE中完美工作,但是当我们在Azure automation中使用相同的代码时,它会清除标记 $rgs = Get-AzureRmResourceGroup | Where-Object {$_.ResourceGroupName -like "*$rg*"} foreach ($rg in $rgs) { $vms = Get-AzureRmVm -ResourceGroupName $rg.ResourceGroupName $

我们有一段代码可以在Powershell ISE中完美工作,但是当我们在Azure automation中使用相同的代码时,它会清除标记

    $rgs = Get-AzureRmResourceGroup | Where-Object {$_.ResourceGroupName -like "*$rg*"} 
foreach ($rg in $rgs) 
{
$vms = Get-AzureRmVm -ResourceGroupName $rg.ResourceGroupName
    $vms.ForEach({
        $tags = $vm.Tags
        $tags['ShutdownSchedule_AllowStop'] = "$False";
        Set-AzureRmResource -ResourceId $_.Id -Tag $tags -Force -Verbose
})
}
到目前为止,我设法确定的是,代码集AzureRmResource-ResourceId$\uid.Id-Tag$tags-Force-Verbose没有将$tags视为hastable。我已经做了一些调试,可以看到$tags=$vm.tags是一个哈希表

我在google上四处查看,看到一些人提到使用[system.collections.hashtable]来指定它是一个hashtable,但这正是我的powershell受到限制的地方。我希望有人能给我指出正确的方向

我尝试过使用ResourceId$\ux.Id-Tag[system.collections.hashtable]$标记,但没有成功

我们试图做的是将标记值从true更改为false。键为Shutdown_AllowStop,当前该值设置为True


提前感谢,并希望这是有意义的:

我想我看到了这个问题。它在ISE中工作,因为您在会话的早期某处定义了$vm。将其更改为$tags=$\标记,这应该适合您

编辑:所以我看了一下,Get-AzureRmVm cmdlet返回一个对象,其中Tags属性是一个可怕的类型,而他们想要返回的是一个哈希表。它的回报是:

[System.Collections.Generic.Dictionary`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]]
或者,如果运行.GetType,则缩写为Dictionary`2。要避免这种情况,您可以在定义类型时显式声明类型:

[hashtable]$tags = $_.Tags

下面的脚本适合我

$rgs = Get-AzureRmResourceGroup | Where-Object {$_.ResourceGroupName -like *$rg*"} 

foreach ($rg in $rgs) 
{
$vms = Get-AzureRmVm -ResourceGroupName $rg.ResourceGroupName
    foreach ($vm in $vms)
    {
        $tags = $vm.Tags
        foreach ($tag in $tags)
        {

            $tag['ShutdownSchedule_AllowStop'] = "$True";
            Write-Output ("Showing VM's resource ID " + $vm.ID)
            Write-output ("Show VM's tag "+[System.Collections.Hashtable]::new($tag))
            $hash = [System.Collections.Hashtable]::new($tag)
            $hash['ShutdownSchedule_AllowStop']
            Set-AzureRmResource -ResourceId $vm.ID -Tag $hash  -ApiVersion "2017-12-01" -Force -Verbose
        }

    }
}
但是您需要在自动化帐户中更新Azure Power Shell版本,如果不这样做,脚本将无法工作

这是我的测试结果


感谢您这么快回复我:抱歉,新手犯了错误,我补充说,因为我认为它没有读取标记,所以它返回为空数组。。很抱歉,代码实际上是$tags=$\u0.TagsOk,请进一步查看并更新我的答案。希望这能解决这个问题。嗨,谢谢你,我做了一个游戏,但仍然没有任何结果。我使用了ISE的精确代码,它设置了t值,然后使用了脚本和你的修改[hashtable]$tags=$\uTags,仍然没有任何结果。这让我好几天都目瞪口呆……出于好奇,你不使用Update-AzureRmVm有什么原因吗?嗨,我试过使用$vm | Update-AzureRmVm-Tags$Tags,但结果相同可能会有帮助。我在实验室测试,标签数据类型是System.Collections.Generic.Dictionary2[System.String,System.String]`,您需要将其转换为哈希表。@Shengbaushui MSFT感谢您的检查,我如何将其转换为哈希表,我已经按照Madtachbician建议使用“[hashtable]”进行了尝试$tags=$\.tags'或者我错过了另一种方式。我尝试这个$hash=[System.Collections.Hashtable]::new$tag。我在实验室测试,数据类型正确。但是我也不能添加标签。@shengbaushui MSFT谢谢你。。当我开始工作的时候,我会检查一下,只是好奇它在你们的实验室环境中起作用了吗?