2015-06-02 3 views
1

Я не могу представить эту комбинацию из массива/цикла. Я ищу запуск сценария, который будет получать все активные сетевые карты, а затем переименовать их на основе CSV-файла. Впоследствии я создаю команду NIC и снова использую CSV-файл для настройки статической сетевой информации.Переименование нескольких nics с использованием CSV-файла

я получить все активные NICs с помощью:

$Adapter = Get-NetAdapter | where {$_.status -eq "up"} 

Заголовки файлов CSV в следующем виде:

host newname ipaddress subnet gateway dns 

В столбце newname имеет значение admin1a;admin1b.

Вот пример, который работает, но выдает ошибку:

Foreach ($entry in $DC1_NICS) { 
    $NewName = $entry.NewName.split(";") 
    Foreach ($item in $NewName) { 
     Foreach ($nic in $Adapter) { 
      Rename-NetAdapter -Name $Nic.Name -NewName $item 
     } 
    } 
} 

Итак, у меня есть два названия, которые я могу расколоть, admin1a и admin1b, но я не могу показаться, чтобы получить сетевые адаптеры, которые будут названы соответствующим образом, либо только один сетевой адаптер переименовывается или оба выполняются, а затем появляются дополнительные ошибки.

+0

Покажите нам весь файл CSV или, по крайней мере, образец. –

+0

@WalterMitty Не имеет значения, как выглядит весь CSV. Проблема не в его CSV, это с его петлями ForEach. Ответ скоро. – TheMadTechnician

ответ

2

Проблема заключается в том, что ваши вложенные петли ForEach, поскольку они принимают первое имя, то для каждого сетевого адаптера он пытается назвать этот сетевой адаптер для имени, а затем он перемещается во второе имя и для каждого сетевого адаптера он пытается назвать это так, скажем, у вас есть сервер с 2 сетевыми картами, а ваш CSV дает имена Admin1 и Admin2. Он перебирает имена и запустить внутренний цикл каждый раз:

Rename NIC1 к Admin1
Rename NIC2 в Admin1

Затем он делает то же самое для второго имени, ADMIN2:

Rename NIC1 - Admin2
Переименуйте NIC2 в Admin2

Так вот в чем проблема: вам нужно перебирать как сетевые адаптеры, так и новые имена. В этом случае вам нужен цикл For. Подключите его к числу сетевых адаптеров, и будем надеяться, что у вас будет достаточно имен, указанных в вашем CSV.

Foreach ($entry in $DC1_NICS) { 
    $Adapter = Get-NetAdapter | where {$_.status -eq "up"} 
    $NewName = $entry.NewName.split(";") 
    For($i = 0;$i -lt $Adapter.count;$i++){ 
     Rename-NetAdapter -Name $Adapter[$i].Name -NewName $NewName[$i] 
    } 
} 

Таким образом, первый NIC получает первое имя, а второй NIC получает второе имя, а если есть третья NIC он получит третье имя. Это не решает тот факт, что он выглядит так, как будто он предназначен для нескольких серверов, и вы выполняете функцию только на хост-сервере, но он решает проблему проблемы, о которой вы специально задали.

+0

Это похоже на работу, но счетчик конца $ i равен 3, поэтому он выполняет итерацию через 3 раза вместо двух, таким образом отправляя сообщение об ошибке в третьем прогоне, поскольку для переменной имени нет ничего. Я подозреваю, что $ i -le $ adapter.count должен был предотвратить другой вход в цикл for, это правильно? – JMeterX

+0

А, ну, извините. Это должно быть '-lt', а не' -le'. Я обновлю ответ, чтобы это отразить. ('-lt' - это« меньше », а« -le »-« меньше или равно », поэтому это остановится, когда станет равным, а не будет работать в последний раз, когда оно будет равным) – TheMadTechnician

Смежные вопросы