Preciso executar um arquivo em lote ao desbloquear o computador e, em parte, ele precisa testar se estou ou não na minha rede doméstica.
Minha solução atual envolve executar ping no HTPC e presumir que, se ele puder ser encontrado, estarei em casa. Estou ciente de que esta não é a melhor solução - para começar, se o HTPC estiver desligado, ele falhará.
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]
Existe uma maneira mais robusta de fazer isso?
Responder1
Estive lá, fiz isso.
Primeiro verifique/espere se a sua rede está realmente conectada e se você tem o TCPIP ativado. (No caso de conexão Wifi após o login, seu script pode iniciar antes que o Wifi esteja realmente funcionando.)
A saída "ipconfig" (SEM o parâmetro /all) mostrará apenas interfaces que estão UP e fornecerá o endereço IP do padrão Porta de entrada.
Em seguida, execute ping no gateway padrão, que deve ser o seu roteador (presumo que esteja sempre ativado).
Em seguida, execute grep na saída de "arp -a" para ver se o endereço MAC do seu roteador está lá. (Se você usar a verificação com e sem fio para ambos os endereços MAC. Eles provavelmente NÃO são iguais.)
Essa verificação de endereço MAC também detecta o caso em que você está na rede de outra pessoa, onde o roteador tem o mesmo endereço IP como você tem em casa.
E não há necessidade de fazer isso 4 vezes com atrasos (presumo que seja uma tentativa de tirar o HTPC do modo de espera, se necessário). Apenas 1 ping (que no Windows faz 4 pings com 1 segundo de atraso) para o roteador é suficiente.
O roteador responderá (para que você possa verificar o MAC) ou não. Nesse caso, algo está realmente errado com a rede e ela ficará inutilizável de qualquer maneira.
O código abaixo foi testado no Windows 10. Tenho quase certeza de que funcionará em qualquer versão do 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)