You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改VM IP配置CSV中MAC地址的倒数第二分组为99

解决方案

要实现将MAC地址倒数第二分组替换为"99"的需求,你可以在原脚本的导出IP配置阶段添加MAC地址修改逻辑,这样生成的CSV文件直接包含修改后的MAC,无需后续额外处理。以下是修改后的完整脚本:

$sudatapath = "c:\UpgradeData"

# 定义MAC地址修改函数
function Modify-MacAddress {
    param([string]$Mac)
    $macParts = $Mac -split ':'
    if ($macParts.Count -eq 6) {
        # 将倒数第二组替换为99
        $macParts[4] = '99'
        return $macParts -join ':'
    }
    # 格式无效时返回原MAC
    return $Mac
}

$OSV = [environment]::OSVersion.Version
$psVersion = $PSVersionTable.PSVersion
If ($psVersion) {
    $psversion=2
}
Else{
    $psversion=1
}
write-host "vmretainer ran" >$sudatapath\vmretainerran.txt

#Check if task needs scheduling
if( -not (test-path "$sudatapath\iprestoredfinal.flg") -and ($psversion -eq 2))
{
    write-host $psversion
    schtasks /create /tn "vmipretainer" /sc onstart /rl highest /ru system /tr "powershell.exe -Executionpolicy bypass -NonInteractive -NoLogo -NoProfile -File c:\UpgradeData\vmipretainer.ps1" /F
}

if( -not (test-path "$sudatapath\iprestoredfinal.flg") -and ($psversion -eq 1))
{
    write-host $psversion
    schtasks /create /tn "vmipretainer" /sc onstart /rl highest /ru system /tr "powershell.exe c:\UpgradeData\vmipretainer.ps1 -noprofile –Noninteractive" /F
}


if( -not (test-path "$sudatapath\ipexported.flg"))
{
    if( -not (test-path "$sudatapath")) {mkdir $sudatapath}
    write-host "ipexport ran" >$sudatapath\ipexportran.txt

    if ($psversion -eq 2)
    {
        $ResultIPTable = @()
        $NICs = Get-WMIObject Win32_NetworkAdapterConfiguration -computername . | where{$_.IPEnabled -eq $true} 
        Foreach($NIC in $NICs) {
            $IPTable = @{}
            $IPTable.Add("sIP",$NIC.IPAddress[0])
            # 使用修改后的MAC地址
            $IPTable.Add("sMACAddress", (Modify-MacAddress $NIC.MACAddress))
            $IPTable.Add("sgateway",[string]$NIC.DefaultIPGateway)
            $IPTable.Add("smask",$NIC.IPSubnet[0])
            $IPTable.Add("sdns",[string]$NIC.DNSServerSearchOrder)
            $IPTable.Add("sdescription",$NIC.Description)
            $IPTable.Add("sDHCPEnabled",$NIC.DHCPEnabled)
            $IPTable.Add("sDNSDomain",$NIC.DNSDomain)
            $ResultIPTable += New-Object PsObject -Property $IPTable
        }
        $ResultIPTable | Export-Csv -NoTypeInformation "$sudatapath\ipsettings.csv"
        $gd = Get-Date
        echo "exportedsettings" $gd >"$sudatapath\ipexported.flg"
        exit
    }

    if ($psversion -eq 1)
    {
        $result2008table = @()
        $NICs = Get-WMIObject Win32_NetworkAdapterConfiguration -computername . | where{$_.IPEnabled -eq $true} 
        Foreach($NIC in $NICs) {
            $2008table = New-Object -TypeName PSObject
            $2008table | Add-Member -MemberType NoteProperty -Name sIP -Value $NIC.IPAddress[0]
            # 使用修改后的MAC地址
            $2008table | Add-Member -MemberType NoteProperty -Name sMACAddress -Value (Modify-MacAddress $NIC.MACAddress)
            $2008table | Add-Member -MemberType NoteProperty -Name sgateway -Value ([string]$NIC.DefaultIPGateway) 
            $2008table | Add-Member -MemberType NoteProperty -Name smask -Value $NIC.IPSubnet[0]
            $2008table | Add-Member -MemberType NoteProperty -Name sdns -Value ([string]$NIC.DNSServerSearchOrder)
            $2008table | Add-Member -MemberType NoteProperty -Name sdescription -Value $NIC.Description
            $2008table | Add-Member -MemberType NoteProperty -Name sDHCPEnabled -Value $NIC.DHCPEnabled
            $2008table | Add-Member -MemberType NoteProperty -Name sDNSDomain -Value $NIC.DNSDomain
            $Result2008Table += $2008table
        }
        # 修正原脚本的错误:将Export-Csv移到循环外,避免重复写入
        $Result2008Table | Export-Csv -NoTypeInformation "$sudatapath\ipsettings.csv"
        $gd = Get-Date
        echo "exportedsettings" $gd >"$sudatapath\ipexported.flg"
    }
}

if (test-path "$sudatapath\ipexported.flg")
{
    write-host "Restoring NIC IP"
    write-host "Restoring NIC IP" >$sudatapath\iprestoreran.txt
    $NICIMPORTS = Import-Csv "$sudatapath\ipsettings.csv"
    $i = 0
    $NICs = Get-WMIObject Win32_NetworkAdapterConfiguration -computername . | where{$_.IPEnabled -eq $true}
    foreach ($NICIMPORT in $NICIMPORTS){ 
        $sIP = $NICIMPORT.sIP 
        $sMACAddress = $NICIMPORT.sMACAddress 
        $sgateway = $NICIMPORT.sgateway.trim('{}')  
        $smask = $NICIMPORT.smask 
        $sdns = $NICIMPORT.sdns.trim('{}') 
        $sDHCPEnabled = $NICIMPORT.sDHCPEnabled
        
        if( $NICs[$i].IPAddress[0] -ne $sIP)
        {
            write-host "IPs do not match $($NICs[$i].IPAddress[0]) $sIP"
            write-host "IPs do not match $($NICs[$i].IPAddress[0]) $sIP" >$sudatapath\ipchangeran.txt
            $sndns=($sdns.Split(" ")[0],$sdns.Split(" ")[1])
            write-host "Restoring IP Address from CSV"
            $NICs[$i].EnableStatic($sIP, $smask)
            $NICs[$i].SetGateways($sgateway)
            $NICs[$i].SetDNSServerSearchOrder($sndns)
            $gd = Get-Date
        }   
        $i++
    }
    echo "IPrestored" $gd > "$sudatapath\iprestored.flg" 
    if (Get-item "$sudatapath\ipexported.flg" | Where LastWriteTime -lt (Get-Date).AddDays(-60)){schtasks.exe /delete /f /tn vmipretainer}
} 

修改说明

  1. 新增MAC地址修改函数:Modify-MacAddress函数将MAC地址按冒号拆分,替换倒数第二分组(数组索引4)为"99"后重新拼接,确保格式正确。
  2. 替换导出阶段的MAC值:在PowerShell v2和v1的导出逻辑中,将原$NIC.MACAddress替换为(Modify-MacAddress $NIC.MACAddress),直接生成包含修改后MAC的CSV文件。
  3. 修复原脚本小问题:将PSv1中的Export-Csv移到循环外部,避免每次循环都覆盖CSV文件,确保所有NIC配置都能正确写入。

这样修改后,导出的ipsettings.csv中的sMACAddress列会自动将倒数第二分组替换为"99",例如00:15:5D:73:48:00会变成00:15:5D:73:99:00。

内容的提问来源于stack exchange,提问作者NinjaNeron

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 05:50:28