Hyper-V Powershell - добавьте двоеточия по адресу MA C - PullRequest
1 голос
/ 27 февраля 2020

У меня есть виртуальная машина с несколькими IP / MA C адресами

Я использую этот код для получения нескольких IP / MA C адресов:

$vms=Get-VM | Where { $_.State –eq ‘Running’ } | Select-Object -ExpandProperty Name 


 foreach($vm in $vms) {

    $out=Get-VMNetworkAdapter -vmname $vm | select VMName, MacAddress, IPAddresses

    $virtm=$out.VMName

    $ip=$out.IPAddresses



    if ($ip.Count -gt 1){

        foreach($i in $ip.Count) {
         if ($ip -match ':'){

         $ip = $ip | ?{$_ -notmatch ':'}

  }
}         
      $ip = $ip -join " "
      $virtm = ($virtm -split '\n')[0]
}
     else {
     $ip=$out.IPAddresses
       }

    $mac=$out.MacAddress

     if ($mac.count -gt 1) {

    $mac = $mac -join " "
        }

   foreach($m in $mac) {
     $mac=$m.Insert(2,":").Insert(5,":").Insert(8,":").Insert(11,":").Insert(14,":")

    }

     Write-Output "$virtm, $ip, $mac"

Этот код работает очень хорошо, ожидайте, что он может добавить столбцы только к первому MA C address

Текущий вывод:

OAP80, 192.168.87.45 192.168.1.45, 00:15:5D:58:12:5E 00155D58125F

Я хочу добавить столбцы ко всем другим MA C адресов для конкретной ВМ

Желаемый вывод

OAP80, 192.168.87.45 192.168.1.45, 00:15:5D:58:12:5E 00:15:5D:58:12:5F

Я пытался добавить : перед преобразованием коллекции в строку

$mac=$out.MacAddress
  $mac=$mac.Insert(2,":").Insert(5,":").Insert(8,":").Insert(11,":").Insert(14,":")

Но получаю:

Exception calling "Insert" with "2" argument(s): "Collection was of a fixed size."
At line:35 char:6
+      $mac=$mac.Insert(2,":").Insert(5,":").Insert(8,":").Insert(11,":").Insert(1 ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : NotSupportedException

Ответы [ 4 ]

1 голос
/ 27 февраля 2020

Как насчет этого? «$ &» означает весь матч. Есть также отрицательный взгляд на конец строки, поэтому двоеточие не ставится в конце.

$mac = echo 00155D58125F 00155D58125G 00155D58125H
$mac = $mac -replace '..(?!$)','$&:' 
$mac 

00:15:5D:58:12:5F
00:15:5D:58:12:5G
00:15:5D:58:12:5H
1 голос
/ 27 февраля 2020

Короче говоря, вы можете сделать это, чтобы поместить двоеточия в адреса Ma c и объединить их в одну строку с пробелом в качестве разделителя:

$mac = ($out.MacAddress | ForEach-Object {
    $_.Insert(2,":").Insert(5,":").Insert(8,":").Insert(11,":").Insert(14,":")
}) -join ' '

Write-Output "$virtm, $ip, $mac"
0 голосов
/ 27 февраля 2020

Как правильно указал Lee_Dailey: $out.MacAddress содержит массив строк. Вы хотите go над каждым элементом и вставить свои двоеточия, прежде чем объединить их в одну строку:

$mac = $out.MacAddress
$macWithColons = foreach ($m in $mac) 
{
    $m.Insert(2, ":").Insert(5, ":").Insert(8, ":").Insert(11, ":").Insert(14, ":")
}
$macWithColons -join " "
0 голосов
/ 27 февраля 2020

Вам не нужно foreach для $mac Просто используйте после (если ma c в формате XX-xx-xx-xx-xx-xx)

if ($mac.count -gt 1) {

    $mac = $mac -join " "
        }
$mac.Replace('-',':')

вы можете сделать это ( если ma c в формате xxxxxxxxxxxx): $mac=$out.MacAddress|foreach{($_.Insert(2,":").Insert(5,":").Insert(8,":").Insert(11,":").Insert(14,":"))-join " "}

и может удалить это:

if ($mac.count -gt 1) { $mac = $mac -join " " } foreach($m in $mac) { $mac=$m.Insert(2,":").Insert(5,":").Insert(8,":").Insert(11,":").Insert(14,":") }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...