通过哈希表值来预测

时间:2017-10-26 00:22:49

标签: powershell

我知道这个问题已经被哈希表键回答了......但它似乎不适用于哈希表值。

我根据他们所在的群集创建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个虚拟机。所以我知道有更好的方法。

谢谢,

1 个答案:

答案 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