【问题标题】:Get current DNS server used by using Batch code?使用批处理代码获取当前使用的 DNS 服务器?
【发布时间】:2015-10-09 04:49:38
【问题描述】:

语言:BATCH(在 WINDOWS 中使用)

您如何获得您正在使用的当前 DNS 服务器地址?我只需要主服务器地址,但如果您能够获得二级和三级 DNS 地址,那也将有很多帮助。

我已经想出了一种方法,效果很好。

nslookup >dnsnames.txt
findstr Address dnsnames.txt

我唯一不知道该怎么做的是如何删除您正在使用的 DNS 地址之前的“地址”字样(您将通过在中输入 nslookup命令行。这就是我的意思:http://imgur.com/QzcgmIw

我已经了解了如何删除“地址”并留下想要的 DNS 地址 通过使用 FOR /F 但该命令让我大吃一惊,所以除此之外别无他法。不过,您可以向我解释 FOR 的工作原理。

Address: 192.168.0.1

这只是给那些还不了解我的人。我想删除“地址”,但留下“192.168.0.1”。 如何我可以这样做?另外,我如何将剩余的“192.168.0.1”,即我的 DNS 服务器,放入一个 VARIABLE 中?

顺便说一句,这只是我想在检查互联网组件的程序中使用的一小段代码。完整代码:http://pastebin.com/RQQkpQ94

如果您有任何建议或答案,请在下方留言。如果我的问题有问题,由于我是新来的,请通知我。谢谢!

【问题讨论】:

    标签: batch-file dns


    【解决方案1】:

    不知道为什么每个人都错过了这个,但分隔符应该是“:”(注意冒号后面的空格)。如果没有空格,该命令将在 IP 地址之前返回一个空格。

    MC ND 创建的版本在 Windows 10 中不适合我。它返回错误:

    2> was unexpected at this time.
    

    Matt Williamson 的版本对我有用,但分隔符问题仍然存在。

    由于我还不能发表评论,我提供了一个可以正确返回 IP 地址的更正版本:

    for /f "tokens=2 delims=: " %%a in ('echo quit^|nslookup^|find "Address:"') do echo %%a
    

    【讨论】:

    • 你的眼光不错。 MC ND 未能逃脱重定向。我编辑了他的答案。现在它按预期工作。
    【解决方案2】:

    我将尝试解释这种情况下for命令的用法

    1.- 如何获取服务器(仅作为示例):您使用的是什么nslookup localhost。这将输出您刚刚看到的内容。并且可能是消息错误,因为您的 dsn 不知道 localhost,这将被禁止将 stderr 发送到 nul

    nslookup localhost 2> nul
    

    2.- 过滤输出以仅获取地址行:是的,find 或 findstr 是您的朋友。

    nslookup localhost 2>nul | find "Address:"
    

    3.- 需要拆分输出行以仅获取 ip 地址。如您所说,使用了for 命令。

    for /f 允许您执行命令并处理其输出。它将允许您使用一组分隔符在标记中分割一行。在这种情况下,命令的输出需要在冒号(分隔符)上进行拆分,我们得到两个标记,冒号左侧的文本和冒号右侧的文本。我们只需要第二个。

    for /f "tokens=2 delims=:" %%f in ('nslookup localhost 2^>nul ^| find "Address:"') do echo %%f
    

    已编辑 - 添加代码以在 nslookup 的第一行显示 dns 服务器的名称,在 nslookup 的第二行显示其 ip,并将 ip 地址的值保存在变量中

    rem clean variable
    set "ip="
    rem search data
    for /f "tokens=2 delims=:" %%f in ('echo exit^|nslookup 2>nul') do ( @echo %%f & set "ip=%%f" )
    rem remove spaces from variable
    set "ip=%ip: =%"
    

    【讨论】:

    • 这是否适用于您在 nslookup localhost Default Server 中获得的上线?我希望它显示它检索到的 DNS 名称...
    • 它的工作原理相同,但您需要调整文本以查找以选择您想要的行。或者您不能使用find 过滤文本,表明您想要两个带有tokens=1,2 的标记,因此所有行都被处理,并取决于第一个标记(将在%%f 变量中)然后使用该值第二个标记(将在%%g 变量中,未定义但隐含,因为这两个标记)
    • 啊...所以我只是将令牌值从 2 编辑为 1,2?它们是否必须存储在单独的变量中?或者是否有另一种方法可以让您只需键入另一个带有 tokens=1 的 FOR /F 命令?
    • 两个标记,两个变量。如果您正在解析该行,并且只是将两个值分开,那么为什么要解析另一个呢?无论如何是的,如果需要,您可以使用第二个。
    • @EpicTonic:token 表示要检索的分割线内的“部分”。因此,如果分隔符是:,要获取值,token 必须为 2(字符串的第二部分)。 find 正在过滤 nslookup 的输出,因此 for 循环内的代码只处理所需的行。如果您需要Default Server 的行,那么是的,您必须更改它。
    【解决方案3】:

    这会做你想做的:

     for /f "tokens=2 delims=:" %%a in ('echo quit^|nslookup^|find "Address:"') do set DNSIP=%%a
    

    【讨论】:

      【解决方案4】:

      您是否尝试过使用 sed 删除地址字符串?

      类似:

      sed "s/Address:  //" < dnsnames.txt
      

      分别

      findstr Address dnsnames.txt | sed "s/Address:  //"
      

      应该可以。

      Sed for windows 可以在这里下载: http://gnuwin32.sourceforge.net/packages/sed.htm

      【讨论】:

      • 什么“sed”?是命令吗?我在cmd上试过了,还是不行。它是命令的必需语法吗?请回复。它也不在 cmd 帮助列表中。是另一种脚本语言吗?
      • 我编辑了答案。它现在包含指向 Sed for windows 的链接。我意识到您的问题针对的是 Windows 外壳,为时已晚。
      • 啊。我懂了。那么,它会立即输出所需的“192.168.0.1”吗?我应该下载什么包,如果有,你知道不下载外部程序还有其他方法吗?
      • 是的。我测试了解决方案。要删除空格,您必须将 sed 命令调整为 findstr Address dnsnames.txt | sed "s/地址://"。当然 sed 必须在系统路径中。
      猜你喜欢
      • 2011-03-05
      • 1970-01-01
      • 1970-01-01
      • 2021-07-14
      • 2020-10-01
      • 2011-07-05
      • 2021-11-20
      • 1970-01-01
      相关资源
      最近更新 更多