1

我对 cmd 或任何东西都不太熟悉,但我做了一些研究并整理了一些我想要的东西。我试图制作的这个 .bat 将获取 ipconfig/all 的输出并选择以太网适配器的 mac 地址和 ip 地址,并将它们插入到计算机没有的那些实例的预先规定的 url 中的关键位置自动重定向到我酒店的互联网计费设置的首页。这不是正式工作;我只是想稍微“减轻我的负担”并节省打字时间。

我需要在 .txt 中创建的完整地址是 000.000.000.00/defaulta.php?mac=xxxxxxxxxxxx&ip=xxx.xxx.xx.xxx

除了 mac 和 ip 地址(均列为 x)之外的所有内容都与它们在每种情况下所需的完全一样。出于安全原因,故意更改显示为 0 的 IP 地址,无需为此做任何工作。我已经能够创建一个简单的 .bat 来创建 ipconfig 数据的输出到任何用户的桌面以便于访问:

@echo off
ipconfig/all > %userprofile%\Desktop\url_address.txt

我已经尝试使用其他解析解决方案来获取我需要的数据,但是当我进行最简单的替换时,我最容易适应的一个(在此处链接)只会输出最后一个实例,而不是第一个或中间的任何实例。我可以尝试使用其中一种解决方案来仅选择某些线路,但我已经看到一些计算机首先列出他们的以太网,然后是无线,而另一些则首先列出无线,然后是以太网。我需要专门根据以太网线路进行解析,因为房间内没有无线互联网。

这是我个人电脑的输出示例:

Ethernet adapter Local Area Connection:

Connection-specific DNS Suffix  . : xxxx.net
Description . . . . . . . . . . . : Atheros AR8121/AR8113/AR8114 PCI-E Ethernet Controller
Physical Address. . . . . . . . . : xx-xx-xx-xx-xx-xx
DHCP Enabled. . . . . . . . . . . : Yes
Autoconfiguration Enabled . . . . : Yes
Link-local IPv6 Address . . . . . : xxxx::xxxx:xxxx:xxxx:xxxx%12(Preferred) 
IPv4 Address. . . . . . . . . . . : xxx.xxx.xx.xxx(Preferred)

任何查找自己并进行比较的人都会发现它的长度并不完全相同,因此基于字符长度的解析将不起作用,因为不同的客人将拥有不同的卡片等。这意味着我需要解析两个特定点,即物理点url中的mac地址和url中ip地址的ipv4地址。这是否意味着我必须制作两个文本,每个解析一个?以及如何将这两个变量插入到最终 url 中?

所以我的主要问题是:

1)是否可以从以太网数据中获取我需要的两部分并将它们插入所需链接中的适当位置并将其放入.txt中,如果可以,究​​竟需要做什么?

2)我打算的全部功能是否需要通过编写几个.txt文件来完成,因为功能进展到最终解决方案,或者这些都可以输出到客人桌面上的一个文本文件中以减少混乱和更容易删除?

4

1 回答 1

0

问题是tl;博士。这是否符合您的要求?适当地修改xxxx.net和。000.000.000.00

@echo off
setlocal enabledelayedexpansion
set found=0
for /f "tokens=1,2 delims=:(" %%I in ('ipconfig /all') do (
    if !found!==1 (
        for /f %%x in ('echo "%%I" ^| find "Physical Address"') do set mac=%%J
        for /f %%x in ('echo "%%I" ^| findstr "IP[v4]*.Address"') do (
            set ip=%%J
            goto next
        )
    )
    for /f %%x in ('echo "%%J" ^| find /i "xxxx.net"') do set found=1
)
echo Couldn't scrape info.  Press any key to exit.
pause >NUL
goto :EOF

:next
set mac=%mac: =%
start http://000.000.000.00/defaulta.php?mac=%mac:-=%^&ip=%ip: =%

它在输出中执行ipconfig /alland 循环,忽略所有内容,直到遇到xxxx.net(特定于连接的 DNS 后缀)。然后它从那里寻找Physical AddressIPv4寻址。必须从两个捕获中删除空格,并从 MAC 地址中删除破折号,所有这些都通过变量字符串替换。然后它会启动用户的默认 Web 浏览器来访问您构建的 URL。

如果您确实需要将此 URL 写入文本文件而不是启动,则更改

start http://000.000.000.00/defaulta.php?mac=%mac:-=%^&ip=%ip: =%

echo http://000.000.000.00/defaulta.php?mac=%mac:-=%^&ip=%ip: =% >outfile.txt

请务必在 之前放置一个空格,>以确保 Windows 将标准输出重定向到文本文件,而不是 IP 地址恰好以任何结尾的数字。


更新 2013.02.27:

无论用户访问级别(管理员或普通用户)如何,上述内容都应该有效。如果要模拟以非特权用户身份运行,请运行以下命令:

runas /trustlevel:0x20000 cmd

...以受限权限打开 cmd 提示符。然后你可以亲眼看到它ipconfig /all仍然有效。

值得一提的是,ipconfig /all它并不是唯一可以抓取 IP 和 MAC 地址的地方。如果您想要上述脚本的替代方案,请尝试以下脚本:

@echo off
setlocal
for /f "tokens=1,2 delims=={}," %%I in (
    'wmic nicconfig where ^(ipenabled^='TRUE' and dnsdomain is not null^) get ipaddress^, macaddress /format:list'
) do (
    if %%I==IPAddress set ip=%%~J
    if %%I==MACAddress set mac=%%J
)
start "" "http://000.000.000.00/defaulta.php?mac=%mac::=%&ip=%ip%"

和以前一样,不要忘记根据需要更改 URL 中的 IP 地址。


2013.03.29 更新:

好吧,因为没有其他方法适用于每台客户端计算机(因为wmic在 WinXP Home 上不起作用),只是为了看看我是否能做更多的事情,这里有另一个可以尝试的方法——批处理/JScript 混合脚本。用.bat扩展名保存它,我认为它应该适用于 98 和 ME 之后的每个 Windows 版本(如果我没记错的话,错误版)。

和以前一样,不要忘记000.000.000.00在 url 中替换。

@if (@a==@b) @end /* <-- ignore this, please

:: batch portion

@echo off
setlocal
for /f "tokens=1,2" %%I in ('cscript /nologo /e:jscript "%~f0"') do (
    set mac=%%I
    set ip=%%J
)

start "" "http://000.000.000.00/defaulta.php?mac=%mac::=%&ip=%ip%"

goto :EOF

:: JScript portion  (leave this weird bit here, please) --> */

var wmi = GetObject("winmgmts:\\\\.\\root\\cimv2");
var adapters = wmi.InstancesOf("Win32_NetworkAdapterConfiguration");
for (var res=new Enumerator(adapters); !res.atEnd(); res.moveNext()) {
    var adapter = res.item();

    /* -------------------------------------------------------------
    Note to supergaijin: If this script fails like all the others,
    try removing "|| !adapter.DNSDomain" from the following line so
    it reads as follows:  if (!adapter.IPEnabled) continue;
    ------------------------------------------------------------- */

    if (!adapter.IPEnabled || !adapter.DNSDomain) continue;
    WSH.Echo(adapter.MACAddress + ' ' + adapter.IPAddress.toArray()[0]);
}

致谢:我偶然发现了Win32_NetworkAdapterConfiguration使用WMI Explorer的课程。我想出了如何在Scriptomatic的帮助下查询它的子实例(这比 TechNet 文档有用得多)。

于 2013-02-11T19:24:22.647 回答