如何修改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} }
修改说明
- 新增MAC地址修改函数:
Modify-MacAddress函数将MAC地址按冒号拆分,替换倒数第二分组(数组索引4)为"99"后重新拼接,确保格式正确。 - 替换导出阶段的MAC值:在PowerShell v2和v1的导出逻辑中,将原
$NIC.MACAddress替换为(Modify-MacAddress $NIC.MACAddress),直接生成包含修改后MAC的CSV文件。 - 修复原脚本小问题:将PSv1中的
Export-Csv移到循环外部,避免每次循环都覆盖CSV文件,确保所有NIC配置都能正确写入。
这样修改后,导出的ipsettings.csv中的sMACAddress列会自动将倒数第二分组替换为"99",例如00:15:5D:73:48:00会变成00:15:5D:73:99:00。
内容的提问来源于stack exchange,提问作者NinjaNeron
相关产品推荐
相关产品推荐

