在Windows上如何使用批处理脚本获取其eth0 / eth1 / eth2的网络接口名称?

时间:2016-11-28 08:58:53

标签: windows batch-file networking interface

我在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

2 个答案:

答案 0 :(得分:1)

这应该为您提供网络接口名称:

@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

答案 1 :(得分: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,因为我在[{1}}中没有多少经验,但WMIC就足够了。
请注意,netsh非常重要,因为此脚本基于检查SetLocal EnableDelayedExpansion。 cmd-parser将用ERRORLEVEL分隔的每个命令块解析为一个单独的命令,就像它写在一行上一样(在我们的例子中是())。因此,除非您使用延迟扩展,否则无法在FOR ... ( ... )内使用更新后的变量值。如果您不这样做,则只能使用输入块之前的值。由于()可以在每次迭代中发生变化(如果在接口地址上方的ERRORLEVEL找到了IP地址,则为0;如果没有,则为1),我们总是需要更新的价值。这也是我使用findstr代替经典!ERRORLEVEL!的原因 有关%ERRORLEVEL%的更多信息,请访问here

使用EnableDelayedExtension运行上面的脚本(不要忘记更改为您的IP)会得到以下结果:

set ownIP=127.0.0.1

如果您希望每次调用脚本时都将IP地址作为参数传递,请使用>search_interface.bat IP-address 127.0.0.1 from interface Loopback Pseudo-Interface 1 (但不要忘记添加检查是否已通过参数在那种情况下)。

希望它有所帮助。

祝你好运!