2015-07-06 4 views
0

Я хочу использовать 2 массива в одном цикле, но каждый раз я не могу узнать, как это сделать?Использовать 2 массива в одном цикле

$hosts = "1.1.1.1,2.2.2.2,3.3.3.3" 
$vmotionIPs = "1.2.3.4,5.6.7.8,7.8.9.0" 
foreach ($host in $hosts) ($vmotionIP in $vmotionIPs) 
    New-VMHostNetworkAdapter -VMHost $host-VirtualSwitch myvSwitch ` 
    -PortGroup VMotion -IP $vmotionIP -SubnetMask 255.255.255.0 ` 
    -VMotionEnabled $true 

Я знаю, что приведенный выше синтаксис неверен, но я просто надеюсь, что он передает мою цель здесь.

ответ

3

Самый простой способ заключается в использовании Hashtable:

$hosts = @{ 
    "1.1.1.1" = "1.2.3.4" # Here 1.1.1.1 is the name and 1.2.3.4 is the value 
    "2.2.2.2" = "5.6.7.8" 
    "3.3.3.3" = "7.8.9.0" 
} 

# Now we can iterate the hashtable using GetEnumerator() method. 
foreach ($hostaddr in $hosts.GetEnumerator()) { # $host is a reserved name 
    New-VMHostNetworkAdapter -VMHost $hostaddr.Name -VirtualSwitch myvSwitch ` 
     -PortGroup VMotion -IP $$hostaddr.Value -SubnetMask 255.255.255.0 ` 
     -VMotionEnabled $true 
} 
3

первых, ваши массивы не являются массивами. Они просто струны. Для массивов вам необходимо указать их как:

$hosts = "1.1.1.1","2.2.2.2","3.3.3.3"; 
$vmotionIPs = "1.2.3.4","5.6.7.8","7.8.9.0"; 

Во-вторых, $host является зарезервированным переменной. Вы не должны этого использовать.

В-третьих, я предполагаю, что вы хотите, чтобы первый хост использовать первый vmotionIP, второй хозяин использовать второй vmotionIP и т.д.

Таким образом, стандартный способ сделать это, чтобы сделать это:

$hosts = "1.1.1.1","2.2.2.2","3.3.3.3"; 
$vmotionIPs = "1.2.3.4","5.6.7.8","7.8.9.0"; 

for ($i = 0; $i -lt $hosts.Count; $i++) { 
    New-VMHostNetworkAdapter -VMHost $hosts[$i] ` 
     -VirtualSwitch myvSwitch ` 
     -PortGroup VMotion ` 
     -IP $vmotionIPs[$i] ` 
     -SubnetMask 255.255.255.0 ` 
     -VMotionEnabled $true; 
} 

Или вы можете использовать метод хеш-таблицы @AlexanderObersht. Тем не менее этот метод меньше всего изменит ваш код.

0

Благодарим вас за информацию. То, что вы предложили, заработало для меня какой-то другой скрипт, но я добился этого, используя следующее. первых я произвел серию IP-адресов, как этот

$fixed = $host1.Split('.')[0..2] 
$last = [int]($host.Split('.')[3]) 
$max = Read-Host "Maximum number of hosts that you want to configure?" 
$max_hosts = $max - 1 
$hosts = 
$last..($last + $max_hosts) | %{ 
[string]::Join('.',$fixed) + "." + $_ 
} 

, а затем я сделал

$vMotion1_ip1 = Read-Host "the 1st vmotion ip of the 1st host?" 
$fixed = $vMotion1_ip1.Split('.')[0..2] 
$last = [int]($vMotion1_ip1.Split('.')[3]) 
$max_hosts = $max - 1 
$vMotions = 
$last..($last + $max_hosts) | %{ 
[string]::Join('.',$fixed) + "." + $_ 
} 
$first = [string]::Join('.',$fixed) + "." + $_ 

foreach ($vmhost in $vMotions) {write-host "$vmhost has the following  network ("$first$(($last++))", "255.255.255.0")"} 

не точно, как это, но что-то по этому пути.

0

Благодарим всех вас за ответы. В конце концов я использовал это делать. Это позволяет нам перебирать столько массивов, сколько мы хотим в то же время, или включать несколько массивов в один цикл.

$hosts = @("1.1.1.1","2.2.2.2","3.3.3.3") 
$vmotionIPs = @("1.2.3.4","5.6.7.8","7.8.9.0") 
[int]$n = 0 
do 
{ 
$vmhost = $hosts[$n] 
$vmotionIP = $vmotionIPs[$n] 
New-VMHostNetworkAdapter -VMHost $vmhost-VirtualSwitch myvSwitch -PortGroup VMotion -IP $vmotionIP -SubnetMask 255.255.255.0 -VMotionEnabled $true 
$n++ 
} while ($n -lt $hosts.count)