Как я могу перестать повторять весь список несколько раз в ForEach? - PullRequest
1 голос
/ 22 мая 2019

Как я могу применить 1 IP-адрес в списке к 1 серверу в другом списке? Затем перейдите на следующий IP-адрес и примените его к следующему серверу.

servers.txt выглядит так:

server1
server2
server3

ip.txt выглядит так:

10.1.140.80
10.1.140.81
10.1.140.83

Я просто хочу просмотреть список и подать заявку

10.1.140.80 to server1
10.1.140.81 to server2
10.1.140.83 to server3

Вместо этого мой сценарий применяет все 3 IP-адреса к каждому серверу. Я не хочу перебирать все IP-адреса снова и снова.

Как правильно перебрать списки и исправить это?

$computers = "$PSScriptRoot\servers.txt"
$iplist        = gc "$PSScriptRoot\ip.txt"

function changeip {
    get-content $computers | % {
        ForEach($ip in $iplist) {

            # Set IP address
            $remotecmd1 = 'New-NetIPAddress -InterfaceIndex 2 -IPAddress $ip -PrefixLength 24 -DefaultGateway 10.1.140.1'

            # Set DNS Servers  -  Make sure you specify the server's network adapter name at -InterfaceAlias
            $remotecmd2 = 'Set-DnsClientServerAddress -InterfaceAlias "EthernetName" -ServerAddresses 10.1.140.5, 10.1.140.6'

            Invoke-VMScript -VM $_ -ScriptText $remotecmd1 -GuestUser Administrator -GuestPassword PASSWORD -ScriptType PowerShell
            Invoke-VMScript -VM $_ -ScriptText $remotecmd2 -GuestUser Administrator -GuestPassword PASSWORD -ScriptType PowerShell

        }
    }
}

changeip

1 Ответ

2 голосов
/ 22 мая 2019

Используйте командлет Get-Content, чтобы поместить оба содержимого файла в массив, а затем вывести отдельные значения по позиции массива. Вы, вероятно, захотите некоторую логику, чтобы проверить, соответствует ли размер массива, и пользовательскую обработку, если это не так. В приведенном выше примере вы в основном помещаете для каждого цикла в другой цикл foreach, который дает вам поведение, которое вы видите.

$computers = GC "C:\server.txt"
$iplist   = GC "C:\ip.txt"

for ($i = 0; $i -lt $iplist.Count ; $i++) {
    Write-host  ("{0}  -  {1}" -f $computers[$i],$iplist[$i])
}

Или, если вы состоите в браке с использованием логики foreach для одного списка, чтобы все было так, словно вместо базовой итерации с циклом for, вы можете добавить счетчик в цикл foreach. Затем вы можете посмотреть индекс вашего массива уже проанализированного массива iplist. Это в основном делает то же самое, хотя ..

$computers = "C:\server.txt"
$iplist   = GC "C:\ip.txt"

get-content $computers | % {$counter = 0} {
Write-host  ("{0}  -  {1}" -f $_,$iplist[$counter])
$counter++
}

Только для ясности, обратите внимание на эту строку:

"get-content $ computers |%"

% на самом деле является псевдонимом ForEach-Object, поэтому вы получаете foreach внутри вывода foreach, который вы видите.

...