Powershell重用哈希表foreach循环

时间:2014-10-03 13:15:53

标签: powershell foreach hashtable overwrite

我是PowerShell的新手,我怀疑因为我不是程序员,所以问题的原因可能对大多数人来说非常明显。基本上我的脚本错误

"无法索引到空数组。"

循环收集静态配置的多宿主服务器中每个网络适配器的属性。我的调试语句显示foreach和if按预期工作 - 但似乎我不能在foreach循环中重用哈希表。这里的正确方法是什么? (注意:这是400行脚本的一部分,它主要围绕哈希表,所以我需要尽可能使用哈希表。)

    # hugely truncated.

    $this = @() # initialise results table as an array.
    $ip = "myserver.mydomain.com"


    foreach ($connected_nic in ($Adapter = Get-WmiObject -computer $ip win32_networkadapter -filter "NetConnectionStatus='2'" | where {$_.PNPDeviceID -notmatch "1394"})) { # Find electrically connected adapters, which are not firewire.

    Write-host -ForegroundColor Green $Connected_nic

    if ($cfg=($dns=(Get-WmiObject -ComputerName $ip Win32_NetworkAdapterConfiguration -filter "Index = '$($connected_nic.Index)'")).IPaddress -like "192.168.*") { # test each connected adapter to see if it's IP = 192.168.X.X

    $ips = $dns | select -expandproperty Ipaddress
    $dns # check return is as expected.

    $results = [ordered] @{

    'Netbios Name' = $dns.DNSHostname
    'IPv4 Address' = $ips[0] #cope with ipv6
    'Subnet Mask' = [String]$dns.IpSubnet
    'Default Gateway' = [String]$dns.DefaultIPGateway
    'Primary DNS Server' = $dns.DNSServerSearchOrder[0]
    'Secondary DNS Server' = $dns.DNSServerSearchOrder[1]
    'MAC Address' = $dns.MACaddress
    }

    $dnsout = New-Object PSObject -Property $results # Create a new row for the report from our hash table.
    $this += $dnsout # Add this row to the main report.

    } # Configurations of interest test.
    } # End connected adapter test


    #output



    Netbios Name         : server
    IPv4 Address         : 192.168.228.54
    Subnet Mask          : 255.255.255.0
    Default Gateway      : 192.168.228.5
    Primary DNS Server   : 192.168.228.51
    Secondary DNS Server : 192.168.224.51
    MAC Address          : 00:23:7D:22:1C:52

    Netbios Name         : server
    IPv4 Address         : 192.168.228.54
    Subnet Mask          : 255.255.255.0
    Default Gateway      : 192.168.228.5
    Primary DNS Server   : 192.168.228.51
    Secondary DNS Server : 192.168.224.51
    MAC Address          : 00:23:7D:22:1C:52

    Netbios Name         : server
    IPv4 Address         : 192.168.228.54
    Subnet Mask          : 255.255.255.0
    Default Gateway      : 192.168.228.5
    Primary DNS Server   : 192.168.228.51
    Secondary DNS Server : 192.168.224.51
    MAC Address          : 00:23:7D:22:1C:52


    Connected adapter configurations

    DHCPEnabled      : False
    IPAddress        : {192.168.228.54}
    DefaultIPGateway : {192.168.228.5}
    DNSDomain        : 
    ServiceName      : l2nd
    Description      : HP NC373i Multifunction Gigabit Server Adapter #2
    Index            : 2

    DHCPEnabled      : False
    IPAddress        : {192.168.1.1}
    DefaultIPGateway : 
    DNSDomain        : 
    ServiceName      : VMnetAdapter
    Description      : VMware Virtual Ethernet Adapter for VMnet1
    Index            : 9

    DHCPEnabled      : False
    IPAddress        : {192.168.18.1}
    DefaultIPGateway : 
    DNSDomain        : 
    ServiceName      : VMnetAdapter
    Description      : VMware Virtual Ethernet Adapter for VMnet8
    Index            : 10

编辑以增加细节。 在该示例中,计算机具有三个有效的网络适配器,这些适配器将返回三组配置结果。每组结果将特别针对该网络适配器。当我在我的代码中启用调试日志记录时,我可以看到foreach和if语句正在按我的意愿执行逻辑并返回三组唯一结果。我的问题是捕获输出没有按预期工作。发生的事情是我最终得到了三组完全相同的结果。现在,你可能会想要说某些东西因此是空的并且不能覆盖第一组结果 - 但是 - 这不是真的。我肯定得到三组不同的结果,但是当我尝试哈希表时,只有第一组结果成功地被表示。下次我尝试添加更多结果AKA覆盖 - 它失败,无法索引到空数组。只需复制我的代码并在任何具有多个适配器的计算机上运行它,它将是barf。我想知道如何使它不是barf并成功覆盖哈希表中的第一组结果。这是个问题。

是的,你完全正确 - 谢谢你对我的耐心。 我现在确切地知道问题是什么 - 我的测试对象恰好是一个糟糕的选择。 代码实际上很好。非常感谢!

-ea默默地继续#完美地运作。

1 个答案:

答案 0 :(得分:1)

您的信息相当模糊。我不确定您是否在询问为什么会收到特定的错误消息,或者您是否在询问如何执行其他操作。无论如何,假设您只是在问为什么会收到错误消息 - 错误可能发生在以下3个地方之一:

'IPv4 Address' = $ips[0] #cope with ipv6
'Primary DNS Server' = $dns.DNSServerSearchOrder[0]
'Secondary DNS Server' = $dns.DNSServerSearchOrder[1]

$ ips或$ dns变量为空,或者您使用的属性为空。当你试图像你正在做的那样获取索引,但是数组不存在时它将返回你看到的错误。

您可以通过尝试获取不存在的数组的索引来看到这一点:

$dontexist[5]