如何阻止批量修改IP的PowerShell脚本陷入循环
PowerShell修改多台计算机IP脚本卡顿问题排查与修复
先看你脚本里的几个关键问题,这些是导致修改第一台后卡住的主要原因:
问题点分析
- 变量引用错误:
New-NetIPAddress里的Computer.$IP是语法错误,应该是$Computer.IP,这个错误会导致设置无效IP,甚至直接报错中断,引发后续逻辑卡住。 - CIM会话未复用且未处理断开:每次调用
-cimSession $Computer.name都会临时创建会话,当你修改目标计算机IP后,原CIM会话会因为网络地址变更而断开,后续命令会一直等待会话响应,导致脚本陷入假死。 - 适配器筛选不明确:
Get-NetAdapter -cimSession $Computer.name | ? {$_.Status -eq "up"}可能返回多个网卡,操作多个网卡会引发不可预期的问题,甚至导致网络中断后无法恢复连接。 - 缺少错误处理:没有设置超时或错误捕获,一旦命令执行超时或失败,脚本会一直挂起。
修改后的脚本
$ComputerList = Import-Csv "C:\Users\User\Desktop\1.txt" -Header name,IP $MaskBits = 27 $Gateway = "172.24.80.193" $Dns = "172.25.193.32" $IPType = "IPv4" $CimParams = @{ ComputerName = "" SessionOption = New-CimSessionOption -OperationTimeoutSec 30 } foreach ($Computer in $ComputerList) { $CimParams.ComputerName = $Computer.name try { # 创建CIM会话,设置超时 $cimSession = New-CimSession @CimParams -ErrorAction Stop # 明确筛选要修改的网卡,比如按名称(根据实际情况调整) $adapter = Get-NetAdapter -CimSession $cimSession | Where-Object { $_.Status -eq "Up" -and $_.Name -like "*Ethernet*" } if (-not $adapter) { Write-Warning "[$($Computer.name)] 未找到可用的网络适配器" Remove-CimSession $cimSession continue } # 移除现有IP和网关 $ipConfig = Get-NetIPConfiguration -CimSession $cimSession -InterfaceAlias $adapter.Name if ($ipConfig.IPv4Address) { Remove-NetIPAddress -CimSession $cimSession -InterfaceAlias $adapter.Name ` -AddressFamily $IPType -Confirm:$false -ErrorAction SilentlyContinue } if ($ipConfig.Ipv4DefaultGateway) { Remove-NetRoute -CimSession $cimSession -InterfaceAlias $adapter.Name ` -AddressFamily $IPType -Confirm:$false -ErrorAction SilentlyContinue } # 设置新IP和网关 New-NetIPAddress -CimSession $cimSession -InterfaceAlias $adapter.Name ` -AddressFamily $IPType -IPAddress $Computer.IP ` -PrefixLength $MaskBits -DefaultGateway $Gateway -ErrorAction Stop # 设置DNS Set-DnsClientServerAddress -CimSession $cimSession -InterfaceAlias $adapter.Name ` -ServerAddresses $Dns -ErrorAction Stop Write-Host "[$($Computer.name)] IP配置修改完成" # 主动关闭会话 Remove-CimSession $cimSession } catch { Write-Error "[$($Computer.name)] 配置失败: $_" if ($cimSession) { Remove-CimSession $cimSession } continue } }
关键修改说明
- 修复变量引用:把
Computer.$IP改成$Computer.IP,正确引用CSV里的IP地址。 - 复用CIM会话并设置超时:提前创建带超时的CIM会话,避免每次命令重建会话,同时设置30秒超时,防止无响应卡住。
- 明确网卡筛选:添加
$_.Name -like "*Ethernet*"(根据实际网卡名称调整),确保只操作目标网卡。 - 添加错误处理:用
try/catch捕获异常,出错时输出错误信息并继续下一台,避免脚本中断。 - 主动管理CIM会话:每次操作完成或出错时主动移除CIM会话,释放资源。
另外注意:修改目标计算机IP后,原网络连接会断开,后续如果需要再次连接这台机器,得用新的IP地址。如果你的CSV里是按原主机名导入的,修改IP后主机名可能无法解析,后续操作需改用新IP连接。
内容的提问来源于stack exchange,提问作者teo dallas
相关产品推荐
相关产品推荐

