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

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

[复制链接]
发表于 4 小时前 | 显示全部楼层 |阅读模式
本帖最后由 小白龙 于 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. }
复制代码
发表于 1 小时前 | 显示全部楼层
可以尝试调用WinAPI,PowerShell是支持的。
发表于 1 小时前 | 显示全部楼层
  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 !ips! 223.5.5.5 172.17.2.1
  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
复制代码
 楼主| 发表于 19 分钟前 | 显示全部楼层
cutebe 发表于 2026-5-7 17:32
可以尝试调用WinAPI,PowerShell是支持的。

感谢大佬支招,
怎样调用api, ai的代码没成功.
 楼主| 发表于 18 分钟前 | 显示全部楼层

感谢分享,
不想使用cmd, 想使用powershell+com或net相关函数
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-5-7 19:04

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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