我目前正在编写一个简单的批处理脚本来自动设置 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
但问题是,如果局域网名称不是默认名称(即 Local Area Connection),脚本将无法运行。
有什么方法可以检测所有本地连接名称并使用批处理文件设置所有这些 LAN 连接的 DNS?
任何帮助将不胜感激:)
最佳答案
我已经在 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
语句而不是括号中的脚本。当环境变量在括号脚本中的行为不符合预期时,人们常常会感到困惑。我发现调用标签使脚本更易于使用。
编辑:解释。
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
所以我将第四个标记(状态)和之后的所有标记(名称)传递给脚本函数调用。此处它们作为命令行参数检索,即 %1
和 %2
。
请注意,由于空格的原因,每个名称由两个或三个标记组成,因此使用 *
而不是 5
。
关于batch-file - 在 Windows XP 中检索本地连接名称的批处理文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9815445/