Пакетный командный конфликт - PullRequest
3 голосов
/ 30 августа 2011

Я создал этот пакетный скрипт, который позволит пользователю вводить URL-адрес веб-сайта, а также время в минутах, затем он добавляет URL-адрес в файл hosts и удаляет его по истечении времени.(Эффективная блокировка веб-сайта на определенное время)

Он удаляет веб-сайт из файла hosts, создавая другой пакетный файл при его первом запуске, а затем использует команду AT для запуска нового пакетного файла вуказанное время.Он работает при блокировке нескольких веб-сайтов, единственная проблема заключается в том, что если несколько веб-сайтов настроены на одновременную разблокировку, процесс разблокирования каждого нового созданного пакетного файла, похоже, конфликтует.Как вы увидите, я попытался исправить это, отложив запуск командного файла до завершения работы другого.К сожалению, это не работает большую часть времени.Иногда, если время удачно, оба пакетных файла будут выполняться, не мешая друг другу.Вот код, извините за мои ужасные методы кодирования, он может показаться трудным для понимания:

@echo off
TITLE Site Blocker
SET name=%random%
SET /P url=Enter website (e.g. www.facebook.com)- 
SET /P mins=How many minutes do you want to block it for?: 
GOTO :SET
:BACK
AT %hh%:%mm% C:\Users\%username%\downloads\%name%.bat
echo. >> C:\WINDOWS\System32\drivers\etc\hosts
echo 127.0.0.1 %url% >> C:\WINDOWS\System32\drivers\etc\hosts
echo :TOP >> C:\Users\%username%\downloads\%name%.bat
echo IF EXIST C:\Users\Downloads\temp1.txt GOTO :WAIT >> C:\Users\%username%\downloads\%name%.bat
echo echo DONT DELETE ^>^> C:\Users\Downloads\temp1.txt >> C:\Users\%username%\downloads\%name%.bat
echo find /v "%url%" ^< C:\WINDOWS\System32\drivers\etc\hosts ^> C:\Users\%username%\desktop\temp.txt >> C:\Users\%username%\downloads\%name%.bat
echo del C:\WINDOWS\System32\drivers\etc\hosts /Q >> C:\Users\%username%\downloads\%name%.bat
echo ren C:\Users\%username%\desktop\temp.txt hosts >> C:\Users\%username%\downloads\%name%.bat
echo copy C:\Users\%username%\desktop\hosts C:\WINDOWS\System32\drivers\etc\ >> C:\Users\%username%\downloads\%name%.bat
echo del C:\Users\%username%\desktop\hosts /Q >> C:\Users\%username%\downloads\%name%.bat
echo msg * %url% unblocked >> C:\Users\%username%\downloads\%name%.bat
echo del C:\Users\Downloads\temp1.txt /Q >> C:\Users\%username%\downloads\%name%.bat
echo del C:\users\%username%\downloads\%name%.bat /Q >>  C:\Users\%username%\downloads\%name%.bat
echo exit >> C:\Users\%username%\downloads\%name%.bat
echo :WAIT >> C:\Users\%username%\downloads\%name%.bat
echo timeout 3 >> C:\Users\%username%\downloads\%name%.bat
echo GOTO :TOP >> C:\Users\%username%\downloads\%name%.bat
exit
:SET
set /a mm=%time:~3,2%
set /a hh=%time:~0,2%
if %mm% gtr 60 GOTO :CHECK
set /a mm=%mm%+%mins%
:DONE
if %mm% gtr 60 GOTO :CHECK
if %mm%==60 set /a hh=%hh%+1 & set /a mm=00
GOTO :BACK
exit
:CHECK
if %mm% gtr 60 set /a hh=%hh%+1
if %mm% gtr 60 set /a mm=%mm%-60 & GOTO :DONE
GOTO :DONE

(Программа должна быть запущена от имени администратора для работы. Поэтому я компилирую ее в .exe и добавляю манифест администратораКомпиляция в .exe не проблема, хотя у меня та же проблема при запуске пакета или скомпилированного .exe)

Ответы [ 3 ]

1 голос
/ 10 марта 2012

Мне было немного весело с этим ... и, так как вы еще не отметили ни одного ответа, я подумал, что вы хотели бы увидеть его.Похоже, ваша главная проблема в том, что вы хотите иметь возможность блокировать несколько веб-сайтов и одновременно разблокировать их правильно?

Используя ваш метод, я изменил его с помощью пакета с динамическим циклом, который позволил бы вам добавлять какмногие сайты временно забанить, как вы хотите.таким образом, только один пакет обращается к файлу хостов одновременно.Он также очищает все, что создает, прежде чем избавиться от самого себя.Надеюсь, это поможет:

@echo off
TITLE Site Blocker
setlocal EnableDelayedExpansion
SET name=%random%
SET /P count=How many websites do you need blocked?:
SET /P mins=How many minutes do you want to block them for?: 
SET N=0
:URL_LOOP
SET /a N+=1
IF !N! gtr !count! GOTO SET
SET /P url%N%=Enter website (e.g. www.facebook.com)- 
GOTO URL_LOOP
:BACK
schtasks /create /sc ONCE  /tn %name% /TR C:\Users\%username%\downloads\%name%.bat /st %hh%:%mm%
SET N=0
:HOST_LOOP
SET /a N+=1
IF !N! gtr !count! GOTO END_HOST_LOOP
echo. 127.0.0.1 !url%N%! >> C:\Windows\System32\drivers\etc\hosts
GOTO HOST_LOOP
:END_HOST_LOOP
echo @echo off >> C:\Users\%username%\downloads\%name%.bat
echo setlocal >> C:\Users\%username%\downloads\%name%.bat
echo :TOP >> C:\Users\%username%\downloads\%name%.bat
echo copy C:\Windows\System32\drivers\etc\hosts C:\temp1.txt >> C:\Users\%username%\downloads\%name%.bat
SET N=0
SET M=1
:FIND_LOOP
SET /a M+=1
SET /a N+=1
IF !N! gtr !count! GOTO END_FIND_LOOP
echo find /v "!url%N%!" ^< C:\temp%N%.txt ^> C:\temp%M%.txt >> C:\Users\%username%\downloads\%name%.bat
echo del C:\temp%N%.txt >> C:\Users\%username%\downloads\%name%.bat
GOTO FIND_LOOP
:END_FIND_LOOP
echo xcopy /y C:\temp%N%.txt C:\Windows\System32\drivers\etc\hosts >> C:\Users\%username%\downloads\%name%.bat
echo del C:\temp%N%.txt >> C:\Users\%username%\downloads\%name%.bat
SET N=0
:MSG_LOOP
SET /a N+=1
IF !N! gtr !count! GOTO END_MSG_LOOP
echo msg * !url%N%! unblocked >> C:\Users\%username%\downloads\%name%.bat
GOTO MSG_LOOP
:END_MSG_LOOP
echo schtasks /delete /f /tn %name% >> C:\Users\%username%\downloads\%name%.bat
echo del C:\users\%username%\downloads\%name%.bat /Q >>  C:\Users\%username%\downloads\%name%.bat
echo exit >> C:\Users\%username%\downloads\%name%.bat
echo endlocal >> C:\Users\%username%\downloads\%name%.bat
exit
:SET
set /a mm=%time:~3,2%
set /a hh=%time:~0,2%
if %mm% gtr 60 GOTO :CHECK
set /a mm=%mm%+%mins%
:DONE
if %mm% gtr 60 GOTO :CHECK
if %mm%==60 set /a hh=%hh%+1 & set /a mm=00
GOTO :BACK
exit
:CHECK
if %mm% gtr 60 set /a hh=%hh%+1
if %mm% gtr 60 set /a mm=%mm%-60 & GOTO :DONE
GOTO :DONE
endlocal

Также ... Я использовал schtasks вместо AT , чтобы я мог легко найти задачу после и удалить ее, так как онапозволяет применять уникальные имена вместо перехода с назначенного идентификационного номера.

0 голосов
/ 31 августа 2011

Я не думаю, что это все исправит, но это может упростить чтение / управление, если вы не создали вторичный файл, просто использовали оригинал с аргументами, чтобы указать удаление.

Например (непроверенный, приблизительная оценка):

@echo off
TITLE Site Blocker
if .%1.==.REMOVE. goto :remove
SET name=%random%
SET /P url=Enter website (e.g. www.facebook.com)- 
SET /P mins=How many minutes do you want to block it for?: 
GOTO :SET
:remove
  set URL=%2
  :: do removal stuff
  goto :eof
:SET
AT %hh%:%mm% thisbatchfile.bat REMOVE %URL%

Что вы используете, чтобы скомпилировать его в .EXE?

0 голосов
/ 30 августа 2011

У меня есть сомнения относительно IF, который у вас есть в сценарии, который, кажется, широко используется:

if %mm% gtr 60...

Если идея состоит в том, чтобы проверить в течение минут больше 60, я думаю, это может быть причинойиз ваших вопросов.Минутное значение может быть от 0 до 59, а не 60.

...