批处理文件以在Windows XP中检索本地连接名称

use*_*010 3 lan windows-xp batch-file

我目前正在编写一个简单的批处理脚本来自动设置LAN连接的DNS.这是脚本:

REM Set DNS 
netsh interface ip set dns name="Local Area Connection" static X.X.X.X
netsh interface ip add dns name="Local Area Connection" Y.Y.Y.Y index=2
netsh interface ip add dns name="Local Area Connection" Z.Z.Z.Z index=3
Run Code Online (Sandbox Code Playgroud)

但问题是,如果局域网名称不是默认值(即本地连接),则脚本将无法运行.

有没有什么办法可以检测所有的本地连接名称,并使用批处理文件设置所有这些LAN连接的DNS?

任何帮助将不胜感激 :)

Han*_*ood 10

我在Windows 7中测试了这段代码.您可能需要对Windows XP进行一些修改.

@Echo Off
For /f "skip=2 tokens=4*" %%a In ('NetSh Interface IPv4 Show Interfaces') Do (
    Call :UseNetworkAdapter %%a "%%b"
)
Exit /B

:UseNetworkAdapter
:: %1 = State
:: %2 = Name (quoted); %~2 = Name (unquoted)
If %1==connected (
    :: Do your stuff here, for example:
    Echo %2
)
Exit /B
Run Code Online (Sandbox Code Playgroud)

我只会注意到我总是使用Call语句而不是括号脚本.当环境变量在括号内的脚本中没有表现出预期时,人们常常会感到困惑.我发现调用标签使脚本更易于使用.

编辑: Explination.

For命令读取文件或命令结果的每一行.
In ('command')告诉它读取结果的每一行command.
skip=2跳过前两行输出,在本例中为列标题.
tokens=4*说要读取每一行的第四个东西作为一个变量(4),然后将其作为另一个变量(*). %%a说来存储上述令牌%%a%%b分别.
Do (commands)执行commands每一行.

我的输出NetSh Interface IPv4 Show Interface是:

Idx     Met         MTU          State                Name
---  ----------  ----------  ------------  ---------------------------
  1          50  4294967295  connected     Loopback Pseudo-Interface 1
 15          50        1500  disconnected  Bluetooth Network Connection
 24          10        1500  connected     Network Bridge
Run Code Online (Sandbox Code Playgroud)

所以我接受了第四个令牌(State)和之后的所有令牌(Name)并将它们传递给脚本函数调用.这里将它们作为命令行参数检索,即%1%2.
请注意,由于空格,每个名称由两个或三个标记组成,因此使用*而不是5.