在Windows中,如何使用批处理脚本获取网络接口名,无论是eth0/eth1/eth2?

3

我正在使用 Windows 操作系统,想要获取网络接口的名称,无论是 eth0、eth1、eth2 等等。我编写了一个 Java 程序,通过传递主机/计算机名称,可以找到 IP 地址,然后根据 IP 地址可以找到网络接口的名称。代码如下:

public static String getNetworkInterface() {
        try {
            String computerHostName = "dummy";
            if(!computerHostName.equals("Unknown Computer")) {
                InetAddress address = InetAddress.getByName(computerHostName); 
                return NetworkInterface.getByInetAddress(address).getName();
            }
            else {
                return null;
            }
        }
        catch (SocketException e) {
            e.printStackTrace();
        } 
        catch (UnknownHostException e) {
            e.printStackTrace();
        }
        return null;
    }

以上方法返回类似于eth0 / eth1 / eth2等的值。

我想在Windows上使用批处理脚本实现相同的功能。我编写了以下脚本,它提供主机名和IP地址。但是我不知道如何获取网络接口名称。

for /f "skip=1 delims=" %%A in (
  'wmic computersystem get name'
) do for /f "delims=" %%B in ("%%A") do set "compName=%%A"

echo hostname is %compName%

这个脚本提供了主机名/计算机名。

请帮我获取网络接口名称。

非常感谢。 祝好, Yeshwant


尝试使用以下代码:for /f "tokens=2-5 delims=," %%a in ('wmic nic where "netconnectionid like '%%'" get MACAddress^,AdapterType^,NetConnectionId^,Name /format:csv') do ( echo %%a, %%b, %%c, %%d ) - elzooilogico
嗨,elzooilogico,我尝试了你的建议。如果有任何错误,请指出来:for /f "tokens=2-5 delims=," %%a in ('wmic nic where "netconnectionid like '%%'" get MACAddress^,AdapterType^,NetConnectionId^,Name /format:csv') do ( echo %%a, %%b, %%c, %%d ) 我收到的错误为:C:\Users\user>testnew.batC:\Users\user>for /F "tokens=2-5 delims=," %a in ('wmic nic where "netconnectionid like '%'" get MACAddress,AdapterType,NetConnectionId,Name /format:csv') do (echo %a, %b, %c, %d ) No Instance(s) Available. Invalid XSL format (or) file name.C:\Users\user> - Yeshwant KAKAD
我指定了完整的路径格式:for /f "tokens=2-5 delims=," %%a in ('wmic nic where "netconnectionid like '%%'" get MACAddress^,AdapterType^,NetConnectionId^,Name /format:"%WINDIR%\System32\wbem\en-US\csv"') do ( echo %%a, %%b, %%c, %%d ) 结果是:C:\Users\user>testtemp.batC:\Users\user>for /F "tokens=2-5 delims=," %a in ('wmic nic where "netconnectionid like '%'" get MACAddress,AdapterType,NetConnectionId,Name /format:"C:\Windows\System32\wbem\en-US\csv"') do (echo %a, %b, %c, %d ) 没有可用的实例。 - Yeshwant KAKAD
@yeswant,请在命令行中尝试以下命令:for /f "tokens=2-5 delims=," %a in ('wmic nic where "netconnectionid like '%%'" get MACAddress^,AdapterType^,NetConnectionId^,Name /format:csv') do echo %a, %b, %c, %d。如果您要将其放在批处理文件中,则必须将任何 % 写成 %%,因此 echo %a, %b, ... 将变为 echo %%a, %%b, ... - elzooilogico
谢谢Elzoologico:我尝试了命令行,这是结果。有任何想法关于“无可用实例”是什么意思吗?C:\Users\user>for /f "tokens=2-5 delims=," %a in ('wmic nic where "netconnectionid like '%%'" get MACAddress^,AdapterType^,NetConnectionId^,Name /format:csv') do echo %a, %b, %c, %d没有实例可用。, , , s\user>echo , , ,C:\Users\user> - Yeshwant KAKAD
@yeswant,您没有网络连接或其状态未知。 - elzooilogico
2个回答

3
这应该会给您网络接口的名称:
@Echo Off
For /F "Skip=1Delims=" %%a In (
    '"WMIC NIC Where (Not NetConnectionStatus Is Null) Get NetConnectionID"'
) Do For /F "Tokens=*" %%b In ("%%a") Do Echo=%%b
Timeout -1

Compo:这给我以下结果:C:\Users\user>testtemp1.bat 没有可用的实例。按任意键继续...C:\Users\user> - Yeshwant KAKAD
这意味着准确地表明,您没有网络连接并返回一个在0-65535之间的状态。它所不意味着的是我的代码有错误。 - Compo
这只是为我打印了所有连接的接口...他没有要求根据IP地址给出接口吗? - J.Baoby
除了没有明确要求之外,我的最后回复并没有真正改变这一点,如果没有网络连接,那么我敢打赌它不会有IP地址。 - Compo

1

如果您想根据IP地址查找网络接口,可以使用以下方法:

@echo off
SetLocal EnableDelayedExpansion

set ownIP=W.X.Y.Z
set netifc=
FOR /F "tokens=4*" %%G IN ('netsh interface ipv4 show interfaces ^| findstr /I "[^a-zA-Z]connected"') DO (
    REM set /P =interface %%G is connected < nul >> !progress!
    netsh interface ipv4 show addresses "%%H" | findstr /c "%ownIP%" > nul 2>&1
    IF !ERRORLEVEL! EQU 0 (
        set netifc=%%H
    )
)

:outLoop
echo IP-address %ownIP% from interface %netifc%
EndLocal
exit /b 0

我使用netsh而不是WMIC,因为我在WMIC方面没有太多经验,但netsh在您的情况下足以满足需要。
请注意,SetLocal EnableDelayedExpansion非常重要,因为此脚本基于检查ERRORLEVEL。 cmd解析器将用()分隔的每个命令块解析为一个单独的命令,就好像它是一行编写的一样(在我们的情况下为FOR ... (...) )。 因此,除非使用延迟扩展,否则无法在()中使用具有其更新值的更改变量。如果不这样做,则只能使用进入块之前的值。由于ERRORLEVEL可以在每次迭代中更改(如果IP地址已在接口的地址中被findstr找到,则为0,否则为1),因此我们始终需要更新的值。这也是我使用!ERRORLEVEL!而不是经典的%ERRORLEVEL%的原因。
关于EnableDelayedExtension的更多信息可以在这里找到。
使用上面的脚本并设置ownIP=127.0.0.1(别忘了更改为您的IP),将得到以下结果:
>search_interface.bat
IP-address 127.0.0.1 from interface Loopback Pseudo-Interface 1

如果您想每次调用脚本时将IP地址作为参数传递,请使用set ownIP=%~1(但不要忘记在这种情况下添加一个检查是否已传递参数)。希望对您有所帮助。祝好运!

谢谢 J. Baoby。我首先提供了我的PC的IP地址,然后是127.0.0.1。结果如下所示:C:\Users\user>notepad testtemp1.batC:\Users\user>testtemp1.bat 来自本地连接接口的IP地址192.168.1.152C:\Users\user>testtemp1.bat 来自环回伪装接口1的IP地址127.0.0.1C:\Users\user> 它没有给我我想要的。为什么通过Java程序我得到eth4但批处理脚本给我值“本地区域网络”/“环回伪装接口1”? - Yeshwant KAKAD
NetworkInterface类中,有两个方法经常被人们混淆:getDisplayNamegetName。这两个方法是不同的,具有不同的工作方式:第一个方法提供了操作系统(在我们的情况下是Windows)提供的设备描述,而后者是Java自己创建的接口名称,使其更具可移植性。 - J.Baoby
这里有一个小教程,他们演示了其中两个。请注意,在某些操作系统中(我认为主要是类Unix的操作系统),2可能会给出相同的结果,但在Windows中显然不是这种情况。由于第一个来自Windows,在我们的情况下,是Windows本身决定将哪些名称传递给Java。我在注册表项中查找了名称。我查找了netshwmic提供的名称,并发现它们与Windows提供给Java的描述性名称完全不同。 - J.Baoby
你也可以进行搜索,只需打开regedit(例如通过运行面板),并搜索Java提供的显示名称和netsh提供的显示名称。我是基于此网站进行搜索的(尽管我省略了“重命名”部分:p)。 - J.Baoby
很高兴能帮忙。希望有所帮助。Windows决定“隐藏”一些真实设备的真正原因对我来说仍然是个谜。也许是出于安全考虑...如果我发现更多信息,我一定会告诉你。 - J.Baoby
好的,谢谢。如果你找到了解决方案,请告诉我。我还没有尝试你提供的解决方案,因为我忙于工作。谢谢Baoby。再见。 - Yeshwant KAKAD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接