Hyper-V Powershell-将冒号添加到MAC地址

Hyper-V Powershell-将冒号添加到MAC地址,powershell,hyper-v,Powershell,Hyper V,我有多个IP/MAC地址的虚拟机 我正在使用此代码获取多个IP/MAC地址: $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

我有多个IP/MAC地址的虚拟机

我正在使用此代码获取多个IP/MAC地址:

$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"
这段代码工作得很好,希望它只能在第一个MAC地址中添加列

电流输出:

OAP80, 192.168.87.45 192.168.1.45, 00:15:5D:58:12:5E 00155D58125F
我想为特定VM的所有其他MAC地址添加列

所需输出

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

对于
$mac
仅在之后使用(如果mac格式为XX XX XX XX XX XX)

您可以这样做(如果mac格式为XXXXXXXXXX):
$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,":") }

正如Lee_Dailey正确指出的:
$out.MacAddress
包含一个字符串数组。在将每个元素合并为单个字符串之前,您希望遍历每个元素并插入冒号:

$mac = $out.MacAddress
$macWithColons = foreach ($m in $mac) 
{
    $m.Insert(2, ":").Insert(5, ":").Insert(8, ":").Insert(11, ":").Insert(14, ":")
}
$macWithColons -join " "

简而言之,您可以这样做,将冒号放在Mac地址中,并将其合并为单个字符串,以空格作为分隔符:

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

Write-Output "$virtm, $ip, $mac"
这个怎么样?“$&”表示整个比赛。行的末尾也有一个负的向前看,所以冒号不会放在末尾

$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

您将
$Mac
集合转换为一个字符串-一个字符串-然后迭代一个项目。[grin]在将项目合并为单个字符串之前,添加您的
。您仍然需要迭代
$out.MacAddress
。否则,您将尝试将冒号插入数组而不是字符串,这是不可能的。因此出现了例外。你能告诉我怎么做吗?我想你指的是“冒号”而不是“列”。MAC地址是
00155D58125F
格式,最后一行是无用的。你可以这样做:
$MAC=$out.MacAddress | foreach{($).Insert(2,:“”。Insert(5,:“”)。Insert(8,:“”)。Insert(11,:“”。Insert(14,:“”)-join“”)
,如果可以删除这个:
($mac.count-gt 1){$mac=$mac-join”“}foreach($mac中的m){$mac=$m.Insert(2“:”).Insert(5“:”).Insert(8“:”).Insert(11“:”).Insert(14“:”)}
@xerks谢谢.P.S。作为
Insert()
的替代方法,您可以使用正则表达式在mac地址中添加冒号:
($-split split([0-9a-f]{2}-ne'))-加入“:”
$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