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.