微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

哈希表、Key 中的多个值、Foreach 循环 Powershell

如何解决哈希表、Key 中的多个值、Foreach 循环 Powershell

我已经用必要的值填充了键, 每个键都有多个值

$vms = @{}
$vms.template += $templateName
$vms.name += $vmName
$vms.EsxiHostName += $esxiHostName
$vms.datastore += $datastoreName
$vms.network += $networkName
$vms.FolderLocation += $folderName
$vms.vcpu += $vcpu
$vms.CoresPercpu += $vmCores
$vms.Memory += $vmRam
$vms.IP += $vmIP
$vms.subnetMask += $vmMask
$vms.gateway += $vmGateway
$vms.DNS1 += $vmDns1
$vms.DNS2 += $vmDns2
$vms.Description += $vmDescription
$vms.TrendMicroScanDay += $tmscanday
$vms.inventory_billing_owner += $inventoryBillingOwner

现在我想做的是这样的事情,因为我想在另一个命令中使用这些变量。

foreach ($vm in $vms) {
    #Assign Variables
    $VCTemplate = $vm.template
    $VMName = $vm.Name
    $VMHost = $vm.EsxiHostName
    $Datastore = $vm.datastore
    $NetworkName = $vm.network
    $FolderLocation = $vm.FolderLocation
    $vcpu = $vm.vcpu
    $CoresPercpu = $vm.CoresPercpu
    $Memory = $vm.Memory
    $VMIP = $vm.IP
    $subnetMask = $vm.subnetMask
    $GW = $vm.Gateway
    $DNS1 = $vm.DNS1
    $DNS2 = $vm.DNS2
    $Description = $VM.Description
    $TrendMicroScanDay = $VM.TrendMicroScanDay
    $inventory_billing_owner = $VM.inventory_billing_owner
}

似乎 foreach 循环不能以这种方式工作,我尝试查找有关它的信息,但无法找到 有人知道如何使用 Foreach 循环和每个键具有多个值的哈希表吗?

谢谢

编辑: 感谢 Mclayton 的回答,我尝试了您的解决方

首先我想把 $vms 里面的东西发给你

PS C:\Users\me\Desktop> $vms
Name                           Value                                                                                                                        
----                           -----                                                                                                                        subnetMask                     {255.255.255.0,255.255.255.255}                                                                                             description                    {TEST,Test 2}                                                                                                               
Memory                         {4,8}                                                                                                                       
name                           {Name1,Test 2}                                                                                                              
vcpu                           {4,8}                                                                                                                       
ip                             {10.10.10.1,20.20.20.1}                                                                                                     datastore                      {vsanDatastore,vsanDatastore}                                                                                               dns2                           {10.10.10.5,20.20.20.5}                                                                                                     
gateway                        {10.10.10.3,20.20.20.3}                                                                                                      
template                       {ESsqlTEMPLATE01,WIN 10 Template}                                                                                           
FolderLocation                 {Office Domain,SysAdmin LAB}                                                                                            
TrendMicroScanDay              {Day5,Day5}                                                                                                                 
CoresPercpu                    {4,8}                                                                                                                       
dns1                           {10.10.10.4,20.20.20.4}                                                                                                     
EsxiHostName                   {es1esxi01p,es1esxi02p}                                                                                 
network                        {servers,data2}

然后使用第一个选项运行此测试

for($i = 0; $i -lt $vms.template.Length; $i++ )
{
  $VCTemplate = $vms.template[$i];
  $VMName2     = $vms.Name[$i];
}
PS C:\Users\me\Desktop> $VCTemplate
WIN 10 Template

我得到了第二个值,可能我没听懂你在说什么

对于第二个选项,我正在考虑在 foreach ($something in $something_else) 但我运行了这个:

$vm3 = @()
$vm3 += new-object PSCustomObject -Property ([ordered] @{
        Template = $vms.template
        Name     = $vms.name
        EsxiHostName = $vms.EsxiHostName
        datastore = $vms.datastore
        network = $vms.network
        FolderLocation = $vms.FolderLocation
        vcpu = $vms.vcpu
        CoresPercpu = $vms.CoresPercpu
        Memory = $vms.Memory
        IP = $vms.IP
        subnetMask = $vms.subnetMask
        gateway = $vms.gateway
        DNS1 = $vms.DNS1
        DNS2 = $vms.DNS2
        Description = $vms.Description
        TrendMicroScanDay = $vms.TrendMicroScanDay
    })

foreach ($vm in $vm3)
{
    write-host 'This is '$vm.template
}

这就是结果

PS C:\Users\me\Desktop> foreach ($vm in $vm3)
{
    write-host 'This is '$vm.template
}

This is  ESsqlTEMPLATE01 WIN 10 Template

解决方法

在您的代码中,$vms 是一个单个哈希表对象,如果您在单个对象上foreach(),循环将只运行一次 . $vms 的所有属性(例如 $vms.template)都是数组这一事实对此没有任何影响。

如果您真的需要使用具有并行数组属性的单个 hastable,那么您需要做的是:

for($i = 0; $i -lt $vms.template.Length; $i++ )
{
  $VCTemplate = $vms.template[$i];
  $VMName     = $vms.Name[$i];
  ... etc ...

  ... now do stuff with the $i'th vm ...
  write-host $vmName;

}

但更好的选择是使用 $vms 创建 @() 作为对象的数组(注意圆括号而不是波浪线) - 例如

$vms = @()
foreach( $something in $something_else )
{
    $vms += new-object PSCustomObject -Property ([ordered] @{
        Template = $something.template
        Name     = $something.name
        ... etc ...
    })
}

然后您可以遍历$vms

foreach ($vm in $vms)
{
    write-host $vm.Name
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。