我正在编写一个简单的批处理脚本来自动设置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
但问题是,如果局域网名称不是默认值(即本地连接),则脚本将无效。
有什么方法可以检测所有本地连接名称,并使用批处理文件设置所有这些LAN连接的DNS?
任何帮助将不胜感激:)
答案 0 :(得分: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
我会注意到我总是使用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
所以我接受第四个令牌(State)和之后的所有令牌(Name)并将它们传递给脚本函数调用。这里将它们作为命令行参数检索,即%1
和%2
请注意,由于空格,每个名称由两个或三个标记组成,因此使用*
而不是5
。
答案 1 :(得分:0)
Windows XP命令'netsh int ip show config'的第一行输出是:
接口“本地连接”的配置
@echo off
for /F tokens^=2^ delims^=^" %%a in ('netsh int ip show config') do set "sUserFriendyName=%%a"
echo/set http://www.opendns.com/ DNS for interface "%sUserFriendyName%"
netsh int ip delete dns "%sUserFriendyName%" all
netsh interface ip set dns name="%sUserFriendyName%" source=static addr=208.67.222.222 register=PRIMARY
netsh interface ip add dns name="%sUserFriendyName%" addr=208.67.220.220 index=2
ipconfig /flushdns