我知道这个问题已经被哈希表键回答了......但它似乎不适用于哈希表值。
我根据他们所在的群集创建VM的哈希值。所以哈希表看起来像这样
$clusters[$clustername][$clustervms] = @{}
每个VM都是哈希表的原因是因为我试图将它与它们的VM标记关联(vmware)。
这段代码的工作速度非常快,但通过将值作为键注入来破坏键...换句话说,而不是键/值对 - 值成为键,键成为值...它只是一个狗屎秀。
foreach ($value in $($clusters.values)) {
$clusters[$value] = (get-tagassignment -entity ($value).name).tag
此代码有效 - 但速度令人难以置信。
foreach ($key in $($clusters.keys)) {
$vms = (Get-Cluster -Name $key | Get-Vm).name
foreach ($vm in $vms) {
$clusters[$key][$vm] = @{};
$tag = (Get-TagAssignment -Entity $vm).tag;
$clusters[$key][$vm] = $tag;
}
}
当我说难以置信的慢 - 我的意思是让VM名称大约需要5秒钟。通过第一个代码(代号:shit show)获取标签分配大约需要7秒钟。我已经在这段代码上等了一分钟,而且那段时间它只通过了6个虚拟机。所以我知道有更好的方法。
谢谢,
答案 0 :(得分:1)
我在上面评论过,我写了一个示例脚本,应该让这个更清楚。另请注意,这个powershell应该是说明性的,并且可以以更有效的方式完成一些/许多/或所有事情。
SELECT c.id
FROM coupon c
WHERE c.id NOT IN (
SELECT s.couponid
FROM signups s
JOIN storelist sl ON s.groupid = sl.groupid
WHERE sl.id = 1
)
最后,为了向您保证迭代哈希值不会花费很多时间:
# for example, im just using sourcedata variable to make this clearer.
# you would normally be populating this hash programatically
# lets say a VM has this payload data:
# @{ vm_name="bar"; os="win" }
$SourceData = @(
@{
cluster_name = "foo";
vms = @( @{ vm_name="bar" ; os="win" }, @{ vm_name="baz"; os="linux" })
}, @{
cluster_name = "taco";
vms = @( @{ vm_name="guac"; os="win" }, @{ vm_name="hot"; os="win" })
})
$clusters = @{}
# load the sourcedata into our clusters catalog
$SourceData | %{
$clusternm = $_.cluster_name
$clusters[ $clusternm ] = @{}
$_.vms | %{
$vmnm = $_.vm_name
$clusters[ $clusternm ][ $vmnm ] = $_
}
}
# show the whole thing
$clusters | ConvertTo-Json | Write-Output
<#
{
"taco": {
"hot": {
"os": "win",
"vm_name": "hot"
},
"guac": {
"os": "win",
"vm_name": "guac"
}
},
"foo": {
"bar": {
"os": "win",
"vm_name": "bar"
},
"baz": {
"os": "linux",
"vm_name": "baz"
}
}
}
#>
# show just a vm
$clusters['foo']['bar'] | ConvertTo-Json | Write-Output
<#
{
"os": "win",
"vm_name": "bar"
}
#>
整个脚本立即运行。只有json转换方法才能使说明性输出增加0.1s