PowerShell修改IP与默认网关第二个八位字节报错求助
修复修改IP及网关第二个八位字节的PowerShell脚本
问题背景
需将IP地址第二个八位字节从42改为41,自行编写的脚本在默认网关部分报错,尝试他人脚本又出现空值调用、数组索引无效等问题。
初始脚本与错误
初始脚本
$oldIP = (Get-NetIPAddress -InterfaceAlias Ethernet0).IPAddress $oldDG = (Get-wmiObject Win32_networkAdapterConfiguration | ?{$_.IPEnabled}).DefaultIPGateway $newIP = $oldIP -replace 42, 41 $newDG = $oldDG -replace 42, 41 #Write-Output $newIP $oldIP #Write-Output $newDG $oldDG New-NetIPAddress -InterfaceAlias Ethernet0 -IPAddress $newIP -PrefixLength 28 -DefaultGateway $newDG
初始错误信息
New-NetIPAddress : Cannot process argument transformation on parameter 'DefaultGateway'. Cannot convert value to type System.String. At line:12 char:95 + ... s Ethernet0 -IPAddress $newIP -PrefixLength 28 -DefaultGateway $newDG + ~~~~~~ + CategoryInfo : InvalidData: (:) [New-NetIPAddress], ParameterBindingArgumentTransformationException + FullyQualifiedErrorId : ParameterArgumentTransformationError,New-NetIPAddress
尝试他人脚本后的错误信息
You cannot call a method on a null-valued expression. At line:15 char:1 - $dgOctets = $oldAdapterConfig.IPv4DefaultGateway.Split('.') - + CategoryInfo : InvalidOperation: (:) [], RuntimeException + FullyQualifiedErrorId : InvokeMethodOnNull Cannot index into a null array. At line:18 char:1 - $dgOctets[1] = '41' - + CategoryInfo : InvalidOperation: (:) [], RuntimeException + FullyQualifiedErrorId : NullArray New-NetIPAddress : Invalid parameter DefaultGateway At line:21 char:1 - New-NetIPAddress -InterfaceAlias Ethernet0 -IPAddress $newIPAddress - ... - + CategoryInfo : InvalidArgument: (MSFT_NetIPAddress:ROOT/StandardCimv2/MSFT_NetIPAddress) [New-NetIPAddress], CimException + FullyQualifiedErrorId : Windows System Error 87,New-NetIPAddress
错误分析
- 初始脚本问题:
Get-wmiObject Win32_networkAdapterConfiguration | ?{$_.IPEnabled}返回多个网卡对象的数组,直接访问.DefaultIPGateway得到的是数组,而New-NetIPAddress的-DefaultGateway参数需要单个字符串,导致类型转换失败。 - 他人脚本问题:
$oldAdapterConfig.IPv4DefaultGateway为null,说明未精准定位目标网卡,导致获取不到网关信息。
修复后的脚本
# 精准获取目标网卡的IP配置 $adapterConfig = Get-NetAdapter -Name Ethernet0 | Get-NetIPConfiguration # 修改IP地址第二个八位字节 $ipParts = $adapterConfig.IPv4Address.IPAddress.Split('.') $ipParts[1] = '41' $newIP = $ipParts -join '.' # 修改默认网关第二个八位字节 $dgParts = $adapterConfig.IPv4DefaultGateway.NextHop.Split('.') $dgParts[1] = '41' $newDG = $dgParts -join '.' # 删除旧IP避免配置冲突 Remove-NetIPAddress -IPAddress $adapterConfig.IPv4Address.IPAddress -InterfaceAlias Ethernet0 -Confirm:$false # 设置新IP和网关 New-NetIPAddress -InterfaceAlias Ethernet0 -IPAddress $newIP -PrefixLength 28 -DefaultGateway $newDG
关键说明
- 使用
Get-NetAdapter + Get-NetIPConfiguration精准定位目标网卡,避免返回多个网卡的数组问题。 - 通过拆分八位字节数组的方式修改,比
-replace更精准(防止IP中其他位置的42被误改)。 - 先删除旧IP,避免同一网卡绑定多个IP导致的配置冲突。
验证命令
运行脚本后,执行以下命令确认修改结果:
# 查看新IP配置 Get-NetIPAddress -InterfaceAlias Ethernet0 | Select-Object IPAddress, PrefixLength # 查看新网关配置 Get-NetRoute -InterfaceAlias Ethernet0 | Where-Object DestinationPrefix -eq '0.0.0.0/0' | Select-Object NextHop
内容的提问来源于stack exchange,提问作者Marcin
相关产品推荐
相关产品推荐

