我需要在解锁计算机时运行一个批处理文件,其中的一部分需要测试我是否在家庭网络上。
我目前的解决方案是 ping HTPC,并假设如果能找到它,那么我就在家。我知道这不是最好的解决方案 - 首先,如果 HTPC 关闭,那么它就会失败。
rem Ping the HTPC 4 times, pausing every 5 seconds.
for /l %%A in (1,1,4) do (
timeout 5 >NUL
ping MyHTPC -n 3 | find "TTL=" > NUL
if not ERRORLEVEL 1 goto working
)
rem The HTPC cannot be found, so we're probably somewhere else
[other code here]
exit
:working
rem The HTPC can be found, so we're probably at home
[other code here]
有没有更强大的方法来做到这一点?
答案1
去过也做过。
首先检查/等待您的网络是否确实已连接,以及 TCPIP 是否已启动。(如果在登录后 Wifi 连接,您的脚本可能会在 Wifi 实际工作之前启动。)
“ipconfig”输出(不带 /all 参数)将仅显示已启动的接口并提供默认网关的 ip 地址。
然后 ping 默认网关,它应该是您的路由器(我假设它始终处于打开状态)。
然后 grep“arp -a”的输出,查看路由器的 MAC 地址是否存在。(如果您同时使用有线和无线,请检查两个 MAC 地址。它们可能不一样。)
此 MAC 地址检查还可以捕获您在其他人的网络上的情况,而路由器恰好具有与您家中相同的 IP 地址。
而且没有必要延迟执行 4 次(我猜想这是为了让 HTPC 退出休眠状态)。只需向路由器发送 1 次 ping 操作(Windows 下会发送 4 次 ping 操作,延迟 1 秒)就足够了。路由器要么会
响应(因此您可以检查 MAC),要么不会响应,在这种情况下,网络确实出了问题,无论如何都无法使用。
下面的代码在 Windows 10 上测试过。我确信它可以在任何 Windows NT 版本上运行。
@echo off
set mymac=ac-9e-17-96-6e-60
set delayedexpansion=on
rem Pull the default gateways from ipconfig and extract the one with a value.
rem Carefull! There is 1 extra space before the ip-address.
for /F "delims=: tokens=2 usebackq" %%a in ( `ipconfig ^| find /I "default gateway"` ) do (
if NOT "%%a."==" ." set IP=%%a
)
echo Default gateway:%IP%
rem Ping it to make sure it appears in arp -a output
ping -n 1 %IP% >nul
rem Filter the line with the ip-address and MAC from arp -a and take action if found
arp -a | find /I "%IP%" | find /I "%mymac%"
if errorlevel 1 (echo Not found: Not at home) else ( echo I'm at home)