簡體   English   中英

Hash 表,鍵中的多個值,Foreach 循環 Powershell

[英]Hash Table, Multiples values in Key, Foreach Loop 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 循環和 Hash 表,每個鍵都有多個值?

謝謝

編輯:感謝麥克萊頓的回答,我嘗試了你的解決方案

首先,我想向您發送 $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單個哈希表 object,如果您在單個 object 上使用foreach() ,則循環只會運行一次 所有$vms的屬性(例如$vms.template )都是 arrays 的事實對此沒有任何影響。

如果您確實需要使用具有並行 arrays 屬性的單個 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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM