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

如何阻止批量修改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
    }
}

关键修改说明

  1. 修复变量引用:把Computer.$IP改成$Computer.IP,正确引用CSV里的IP地址。
  2. 复用CIM会话并设置超时:提前创建带超时的CIM会话,避免每次命令重建会话,同时设置30秒超时,防止无响应卡住。
  3. 明确网卡筛选:添加$_.Name -like "*Ethernet*"(根据实际网卡名称调整),确保只操作目标网卡。
  4. 添加错误处理:用try/catch捕获异常,出错时输出错误信息并继续下一台,避免脚本中断。
  5. 主动管理CIM会话:每次操作完成或出错时主动移除CIM会话,释放资源。

另外注意:修改目标计算机IP后,原网络连接会断开,后续如果需要再次连接这台机器,得用新的IP地址。如果你的CSV里是按原主机名导入的,修改IP后主机名可能无法解析,后续操作需改用新IP连接。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 20:45:38