找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 1108|回复: 8

[问题求助] 获取当前正在使用的网卡的ip等参数设置为静态值

[复制链接]
发表于 2026-5-7 14:49:44 | 显示全部楼层 |阅读模式
本帖最后由 小白龙 于 2026-5-7 15:11 编辑

我使用下面的代码, 获取当前正在使用的网卡的ip等参数设置为静态IP, 同时设置dns为223.5.5.5, 但是怎么搞都搞不定, 下面的还是用gpt搞的结果只有一个错误, 用deepseek, 上百轮下来都没解决, 求大佬支招. 或者分享更简洁有效的方法.

注意: 我需要兼容win7, 10, 11, 所以用com的方法, 其它的方法只能在win10


  1. $s = (New-Object -ComObject WbemScripting.SWbemLocator).
  2.     ConnectServer('.', 'root\cimv2')

  3. foreach ($ad in $s.ExecQuery("SELECT * FROM Win32_NetworkAdapter")) {

  4.     $status = $ad.Properties_.Item("NetConnectionStatus").Value
  5.     $name   = $ad.Properties_.Item("Name").Value

  6.     if ($status -eq 2 -and $name -notlike '*VMware*') {

  7.         $devID = $ad.Properties_.Item("DeviceID").Value

  8.         $cfg = $s.ExecQuery(
  9.             "SELECT * FROM Win32_NetworkAdapterConfiguration WHERE Index=$devID AND IPEnabled=TRUE"
  10.         ) | Select -First 1

  11.         if ($cfg) {

  12.             $ips   = [string[]]$cfg.Properties_.Item('IPAddress').Value
  13.             $masks = [string[]]$cfg.Properties_.Item('IPSubnet').Value
  14.             $gws   = [string[]]$cfg.Properties_.Item('DefaultIPGateway').Value

  15.             $idx = 0
  16.             $found = $false

  17.             foreach ($ip in $ips) {

  18.                 if (
  19.                     $ip -match '^\d+\.\d+\.\d+\.\d+$' `
  20.                     -and $ip -ne '127.0.0.1' `
  21.                     -and $ip -notlike '169.254.*'
  22.                 ) {
  23.                     $found = $true
  24.                     break
  25.                 }

  26.                 $idx++
  27.             }

  28.             if ($found) {

  29.                 $ipv4 = $ips[$idx]
  30.                 $mask = $masks[$idx]
  31.                 $gw   = $gws[$idx]

  32.                 # EnableStatic
  33.                 $retIP = $cfg.GetType().InvokeMember(
  34.                     "EnableStatic",
  35.                     [System.Reflection.BindingFlags]::InvokeMethod,
  36.                     $null,
  37.                     $cfg,
  38.                     @(
  39.                         [string[]]@($ipv4),
  40.                         [string[]]@($mask)
  41.                     )
  42.                 )

  43.                 # Gateway
  44.                 if ($gw) {

  45.                     $retGW = $cfg.GetType().InvokeMember(
  46.                         "SetGateways",
  47.                         [System.Reflection.BindingFlags]::InvokeMethod,
  48.                         $null,
  49.                         $cfg,
  50.                         @(
  51.                             [string[]]@($gw),
  52.                             [int[]]@(1)
  53.                         )
  54.                     )
  55.                 }

  56.                 # DNS
  57.                 $retDNS = $cfg.GetType().InvokeMember(
  58.                     "SetDNSServerSearchOrder",
  59.                     [System.Reflection.BindingFlags]::InvokeMethod,
  60.                     $null,
  61.                     $cfg,
  62.                     @(
  63.                         [string[]]@("223.5.5.5")
  64.                     )
  65.                 )

  66.                 "设置完成 - IP:$ipv4 掩码:$mask 网关:$gw"

  67.                 if ($retIP) {
  68.                     "IP返回码: $($retIP.ReturnValue)"
  69.                 }

  70.                 if ($retGW) {
  71.                     "GW返回码: $($retGW.ReturnValue)"
  72.                 }

  73.                 if ($retDNS) {
  74.                     "DNS返回码: $($retDNS.ReturnValue)"
  75.                 }
  76.             }
  77.         }

  78.         break
  79.     }
  80. }
复制代码
发表于 2026-5-7 17:32:52 | 显示全部楼层
可以尝试调用WinAPI,PowerShell是支持的。
发表于 2026-5-7 18:01:04 | 显示全部楼层
本帖最后由 yakeyun 于 2026-5-8 15:14 编辑
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. chcp 65001 >nul

  4. :: 初始化接口名称变量
  5. set "interfaceName="
  6. for /f "tokens=4-5 delims= " %%a in ('netsh interface show interface ^| find "以太网" ^| find "Connected"') do (
  7.     if not "%%b"=="" (set "interfaceName=%%a %%b") else (set "interfaceName=%%a")
  8.     echo,!interfaceName!

  9. for /f "tokens=2 delims=:" %%a in (
  10.     'netsh interface ip show addresses "!interfaceName!" ^| findstr "IP 地址"'
  11. ) do (
  12.     set "ipd=%%a"
  13. )
  14. set "ip=!ipd: =!"
  15. for /f "tokens=1-4 delims=." %%i in ("!ip!") do set "ips=%%i.%%j.%%k.1"

  16.     :: 设置静态IP和DNS
  17.     netsh interface ip set address "!interfaceName!" static !ip! 223.5.5.5 !ips!
  18. echo,%errorlevel%
  19.     netsh interface ip set dns "!interfaceName!" static 223.5.5.5 >nul
  20. echo,%errorlevel%
  21.     netsh interface ip add dns "!interfaceName!" 8.8.4.4 index=2 >nul
  22. echo,%errorlevel%
  23.     echo,
  24.     echo,静态IP已配置完毕
  25.     echo,
  26. )


  27. pause>nul
复制代码
 楼主| 发表于 2026-5-7 18:45:34 | 显示全部楼层
cutebe 发表于 2026-5-7 17:32
可以尝试调用WinAPI,PowerShell是支持的。

感谢大佬支招,
怎样调用api, ai的代码没成功.
 楼主| 发表于 2026-5-7 18:46:16 | 显示全部楼层

感谢分享,
不想使用cmd, 想使用powershell+com或net相关函数
发表于 2026-5-7 19:26:59 | 显示全部楼层
小白龙 发表于 2026-5-7 18:45
感谢大佬支招,
怎样调用api, ai的代码没成功.

比如:库 Iphlpapi.dll 的 GetAdaptersInfo 函数可以获取 IP 地址、掩码、网关
发表于 2026-5-8 08:26:55 来自手机 | 显示全部楼层
ps不懂,cmd的话有点难,当然单网卡简单的很,得考虑多网卡,虚拟网卡吧,就复杂了。
发表于 6 天前 | 显示全部楼层
  1. # 检查并以管理员权限运行
  2. if (-NOT ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) {
  3.     Write-Host "请求管理员权限..." -ForegroundColor Yellow
  4.     Start-Process PowerShell -Verb RunAs "-NoProfile -ExecutionPolicy Bypass -File `"$PSCommandPath`""
  5.     exit
  6. }

  7. # 获取启用的网络适配器配置
  8. $adapters = Get-WmiObject -Class Win32_NetworkAdapterConfiguration | Where-Object { $_.IPEnabled -eq $true }

  9. foreach ($adapter in $adapters) {
  10.     # 获取当前DHCP分配的IP地址、子网掩码、网关和DNS
  11.     $currentIP = $adapter.IPAddress[0]
  12.     $currentSubnet = $adapter.IPSubnet[0]
  13.     $currentGateway = $adapter.DefaultIPGateway
  14.     $currentDNS = $adapter.DNSServerSearchOrder
  15.    
  16.     # 转换为静态IP
  17.     Write-Host "正在将网卡 [$($adapter.Description)] 从DHCP转换为静态IP..." -ForegroundColor Cyan
  18.     Write-Host "  IP地址: $currentIP" -ForegroundColor Green
  19.     Write-Host "  子网掩码: $currentSubnet" -ForegroundColor Green
  20.    
  21.     # 设置静态IP和子网掩码
  22.     $result = $adapter.EnableStatic($currentIP, $currentSubnet)
  23.    
  24.     if ($result.ReturnValue -eq 0) {
  25.         Write-Host "  IP地址设置成功" -ForegroundColor Green
  26.         
  27.         # 设置默认网关(如果有)
  28.         if ($currentGateway) {
  29.             $gatewayResult = $adapter.SetGateways($currentGateway, 1)
  30.             if ($gatewayResult.ReturnValue -eq 0) {
  31.                 Write-Host "  网关设置成功: $($currentGateway -join ', ')" -ForegroundColor Green
  32.             } else {
  33.                 Write-Host "  网关设置失败,错误代码: $($gatewayResult.ReturnValue)" -ForegroundColor Red
  34.             }
  35.         }
  36.         
  37.         # 设置DNS服务器(如果有)
  38.         if ($currentDNS) {
  39.             $dnsResult = $adapter.SetDNSServerSearchOrder($currentDNS)
  40.             if ($dnsResult.ReturnValue -eq 0) {
  41.                 Write-Host "  DNS设置成功: $($currentDNS -join ', ')" -ForegroundColor Green
  42.             } else {
  43.                 Write-Host "  DNS设置失败,错误代码: $($dnsResult.ReturnValue)" -ForegroundColor Red
  44.             }
  45.         }
  46.     } else {
  47.         Write-Host "  IP设置失败,错误代码: $($result.ReturnValue)" -ForegroundColor Red
  48.         Write-Host "  提示:错误代码0表示成功,1需要重启,其他值参考系统文档" -ForegroundColor Yellow
  49.     }
  50.    
  51.     Write-Host ""
  52. }

  53. Write-Host "操作完成!" -ForegroundColor Cyan
  54. Read-Host "按回车键退出"
复制代码
发表于 3 天前 | 显示全部楼层
本帖最后由 aloha20200628 于 2026-5-25 00:17 编辑

以下 bat+powershell 混编代码存为 test.bat 运行,自动提权,再调用通行 win7-11 系统的 powershell 功能获取当前主网卡基本参数;根据当前网关值选择静态 ip 值,其最后网段序号可由网关最后网段序号递增而得,例如网关为 192.168.1.1,则静态 ip 值可选范围是 192.168.1.2 - 192.168.1.254;改设 dns 为固定值为 223.5.5.5

test.bat
  1. <# ::
  2. @echo off &fltmc>nul 2>&1 || (powershell -c "start '%~f0' -verb runas" &exit/b)
  3. powershell -nop -c "iex(${%~f0}|out-string)" &pause&exit/b
  4. #>
  5. $nac=get-wmiObject -class win32_networkAdapterConfiguration|where{$_.IPEnabled -eq $true -and $_.IPAddress -ne $null}
  6. $dip=$nac.DefaultIPGateway[0]
  7. $sip=$dip -replace '\d+$', '2'  #或选用 $sip=$dip -replace '\d+$', '自定义值'
  8. $new_dns='223.5.5.5'
  9. $nac.EnableStatic($sip,$nac.IPSubnet[0])
  10. $nac.SetGateways($nac.DefaultIPGateway[0],1)
  11. $nac.SetDNSServerSearchOrder($new_dns)
  12. '当前主网卡已被设为静态ip:'+$sip+' dns 已被设为:'+$new_dns
  13. exit
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-5-28 01:56

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表