Para o caso simples de < 200 IPs primeiro você precisa para percorrer o arquivo e obter todos os endereços IP em uma única seqüência de caracteres. Em seguida, você pode chamar o comando netsh duas vezes fora do loop (uma vez para o tráfego de entrada e uma vez para a saída).
Para permitir que ele lide com mais de 200 IPs, adicionei um contador ao loop for. Depois de exceder 200 IPs, ele chamará o comando netsh e redefinirá o contador IP antes de continuar a percorrer o arquivo. O resultado final deve ser que você acabe com uma série de regras no formato "Blockit n ", onde n é um número.
A única seção em que estou inseguro é a lista e as diretivas de exclusão no topo. Para fazer com que eles funcionem corretamente, o script precisa saber quantas regras relevantes de 'Blockit' existem. O melhor que consegui fazer foi listar esses e passar os resultados por meio de um findstr em um loop for. Não tenho certeza de que está funcionando corretamente. Eu continuarei trabalhando nisso, mas pensei em postar isso agora, já que está quase lá - e espero que você consiga descobrir o último passo:)
Observe a adição da diretiva de exclusão enabledelayed no topo - isso nos permite usar! VAR! variáveis de estilo que não serão expandidas durante a inicialização; somente em execução. Caso contrário, a variável final do IPADDR conterá apenas o último IP no arquivo de texto.
@echo off
setlocal enabledelayedexpansion
if "%1"=="list" (
SET /A RULECOUNT=0
for /f %%i in ('netsh advfirewall firewall show rule name^=all ^| findstr Blockit') do (
SET /A RULECOUNT+=1
netsh advfirewall firewall show rule Blockit!RULECOUNT! | findstr RemoteIP
)
SET "RULECOUNT="
exit/b
)
REM Deleting existing block on ips
SET /A RULECOUNT=0
for /f %%i in ('netsh advfirewall firewall show rule name^=all ^| findstr Blockit') do (
SET /A RULECOUNT+=1
netsh advfirewall firewall delete rule name="Blockit!RULECOUNT!"
)
SET "RULECOUNT="
REM Block new ips (while reading them from blockit.txt)
SET /A IPCOUNT=0
SET /A BLOCKCOUNT=1
for /f %%i in (blockit.txt) do (
SET /A IPCOUNT+=1
if !IPCOUNT! == 201 (
netsh advfirewall firewall add rule name="Blockit!BLOCKCOUNT!" protocol=any dir=in action=block remoteip=!IPADDR!
netsh advfirewall firewall add rule name="Blockit!BLOCKCOUNT!" protocol=any dir=out action=block remoteip=!IPADDR!
SET /A BLOCKCOUNT+=1
SET /A IPCOUNT=1
set IPADDR=%%i
) else (
if not "!IPADDR!" == "" (
set IPADDR=!IPADDR!,%%i
) else (
set IPADDR=%%i
)
)
)
REM add the final block of IPs of length less than 200
netsh advfirewall firewall add rule name="Blockit!BLOCKCOUNT!" protocol=any dir=in action=block remoteip=!IPADDR!
netsh advfirewall firewall add rule name="Blockit!BLOCKCOUNT!" protocol=any dir=out action=block remoteip=!IPADDR!
SET "IPCOUNT="
SET "BLOCKCOUNT="
SET "IPADDR="
REM call this batch again with list to show the blocked IPs
call %0 list
Como um aparte, se fosse eu provavelmente procuraria aprender Powershell para esse tipo de coisa (ou mesmo qualquer script em uma plataforma Microsoft semi-moderna). Depois de pegar o jeito, você verá que é muito mais intuitivo que os arquivos em lote.
(P.S. - Para qualquer especialista em arquivo de lote que esteja lendo isso, sinta-se à vontade para sugerir uma alternativa melhor - eu não sou nenhum especialista!)