我是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默默地继续#完美地运作。
答案 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]