Powershell 在Azure Automation中未将哈希表读取为哈希表
我们有一段代码可以在Powershell ISE中完美工作,但是当我们在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 $
$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谢谢你。。当我开始工作的时候,我会检查一下,只是好奇它在你们的实验室环境中起作用了吗?