【问题标题】:How can I resolve the IP address and then set a variable to the resolved pc name如何解析 IP 地址,然后将变量设置为解析的电脑名称
【发布时间】:2014-09-20 10:38:32
【问题描述】:

我正在尝试一种更简单的方法,阅读不太容易弄乱命令,解析 IP 地址,然后将变量设置为所述解析名称。我尝试了以下方法:

FOR /F "TOKENS=3 DELIMS=gw" %%A IN ('PING -a -n 1 IPADDRESS') DO SET "PC=%%A"

哪个在:

Pinging PCNAME [IPADDRESS} with 32 bytes of data:
Reply from IPADDRESS: bytes=32 time =15ms TTL=122

Ping statistics for IPADDRESS:
   Packets: Sent = 1, Received = 1, Lost = 0 (0% loss)
Approximate round trip times in milli-seconds:
   Minimum = 15ms, Maximum = 15ms, Average = 15ms

适用于大多数电脑名称。只有几个“g”和“w”,所以唯一带有第三个标记的行是第一行。我遇到的问题是我们有很多电脑名称,其中一些有“g”。对于那些已解决的地址,它会在该行的第三个“g”处剪切变量。

我尝试在 NSLOOKUP 上使用它,但命令给了我:

C:\Windows\System32>nslookup IPADDRESS
Server:  SERVERNAME
Address:  SERVERIP

Name:    PCNAME
Address:  IPADDRESS

我可以跳过 FOR /F(即跳过 2),但它会读取第 3 行和第 4 行;即,它将变量设置为第 3 行的 pc 名称,但随后在第 4 行将其更改为我不需要的垃圾。

就像我说的,有没有办法轻松解决这个问题?我可以在 for in a for 中进行调用和延迟扩展,但这更难跟踪。

【问题讨论】:

  • 天哪 - 使用 Powershell。或VB脚本。 任何东西,但 .bat 文件!!!!
  • @FoggyDay 已经更像是一个.cmd 文件了。

标签: variables batch-file for-loop


【解决方案1】:

过滤您需要的信息(“姓名:”)

for /f "tokens=2 delims=: " %%i in ('nslookup 192.168.178.1^|find "Name:"') do set name=%%i

【讨论】:

  • 这就是我最终使用的。有趣的是,当我遇到这个时,我正在编辑一个较旧的脚本,它就像一堵砖墙一样击中了我。
  • 不错 +1,我也有同样的问题,但反过来,我需要 IP 地址。这也很有效(在最后做设置地址=%%i。碰巧我正在查找的那些没有多个ip,所以它工作正常//显然我不使用查找名称部分)
【解决方案2】:

有一个简单的方法可以同时用于 PING 或 NSLOOKUP。

使用 PING:

FOR /F "TOKENS=2" %%A IN ('PING -a -n 1 IPADDRESS') DO SET "PC=%%A" & GOTO CONTINUE
:CONTINUE

使用 NSLOOKUP:

FOR /F "SKIP=2 TOKENS=2" %%A in ('NSLOOKUP IPADDRESS') DO SET "PC=%%A" & GOTO CONTINUE
:CONTINUE

GOTO CONTINUE 用于在获取所需信息后中断 FOR。

【讨论】:

  • ....我必须对“& GOTO CONTINUE”部分表示最诚挚的感谢。 SKIP 很好地跳过几行,然后读取所有其他行,这样我就可以只选择我想要的行。美丽的。谢谢你。帮助我处理其他一些事情。
【解决方案3】:
@echo off

    setlocal enableextensions

    set "ip=127.0.0.1"
    set "pcName="

    for /f "tokens=1-3 delims=[]" %%a in ('ping -n 1 -a %ip% 2^>nul') do if not defined pcName if not "%%c"=="" (
        set "pcName=%%a"
        setlocal enabledelayedexpansion
        for %%d in ("!pcName: =\!.") do ( endlocal & set "pcName=%%~nxd")
    )

    echo %pcName%

这会读取 ping 命令的输出,并使用 [] 拆分行。唯一包含方括号的行是带有 pc 名称的行(如果找到)。我们将跳过未分成三个标记的行(%%c 为空)。

第一个标记将包含以字符串为前缀的 pc 名称,指示正在执行 ping 操作。这个字符串是本地化的,并且会根据 windows 语言而变化(在我的例子中,西班牙 windows,它是 "Haciendo ping a")。因此,要求固定令牌是不可靠的。为了避免这种情况,通过用反斜杠替换空格,将字符串转换为错误路径。然后使用标准的for可替换参数修饰符来检索假路径中最后一个元素的名称,即pc名称。

【讨论】:

    【解决方案4】:

    使用原来的方法:

    FOR /F "TOKENS=2* DELIMS=gw" %%A IN ('PING -a -n 1 IPADDRESS') DO if not "%%B"=="" for /f %%C in ("%%B") do SET "PC=%%C"
    

    (只是为了演示)

    【讨论】:

      猜你喜欢
      • 2012-11-27
      • 2019-09-29
      • 2011-03-12
      • 1970-01-01
      • 1970-01-01
      • 2011-05-07
      • 2013-03-25
      • 2020-01-11
      • 1970-01-01
      相关资源
      最近更新 更多