Конфликт пакетной команды

Я создал этот пакетный скрипт, который позволит пользователю вводить 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)


person Josh    schedule 30.08.2011    source источник
comment
+1 за самый эпический пакетный сценарий, который я когда-либо видел O.o   -  person Kornel Kisielewicz    schedule 30.08.2011
comment
@Kornel Kisielewicz, ха-ха, вам стоит взглянуть на пакетный сетевой чат, который я создал недавно ... действительно эпично: P   -  person Josh    schedule 30.08.2011
comment
Почему вы не используете Powershell ??   -  person manojlds    schedule 30.08.2011
comment
@ Джош, Боже! Д: ... Я помню, в старые времена была приключенческая игра Hobbit, запускавшаяся из командной строки, которая состояла из множества пакетных скриптов ...   -  person Kornel Kisielewicz    schedule 30.08.2011
comment
@manojlds, есть тысячи более мощных альтернатив, но написание пакетных сценариев похоже на древнее искусство, которое практикуют не потому, что это самый быстрый способ, а потому, что это самый быстрый способ, а его церемония ... как чайная церемония ...   -  person Kornel Kisielewicz    schedule 30.08.2011
comment
@Kornel Kisielewicz Ха-ха, правда: P   -  person Josh    schedule 30.08.2011
comment
Возможно, у вас будет один «пакетный файл очереди», чтобы каждая задача расписания запускала один и тот же файл .bat. Будет прочитан весь этот список, который будет удален, будет проверена отметка времени и, соответственно, удалена. Затем установите уникальный заголовок для вашего скрипта. Наконец, в начале скрипта проверьте, работает ли он уже с чем-то вроде 'tasklist / FI WINDOWTITLE eq TEST / NH'.   -  person Gary    schedule 30.08.2011
comment
Кроме того, я думаю, что этот ответ предоставит вам более простой способ удалить конкретную строку текста: stackoverflow.com/questions/418916/   -  person Gary    schedule 30.08.2011
comment
Я пытаюсь понять, для чего это будет использоваться ... Почему вы хотите заблокировать веб-сайт только на определенное время?   -  person rud3y    schedule 01.03.2012


Ответы (3)


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

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

@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, чтобы я мог легко найти задачу после и удалить ее, поскольку это позволяет вам применять уникальные имена вместо того, чтобы переходить из присвоенный идентификационный номер.

person iesou    schedule 09.03.2012

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

if %mm% gtr 60...

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

person Arun    schedule 30.08.2011
comment
Я не думаю, что это проблема, потому что если% mm% == 60, тогда час увеличивается на единицу, а минуты возвращаются к 0. Расчет времени ожидания перед запуском нового командного файла, кажется, работает нормально. Единственная проблема, похоже, заключается в том, что одновременно разблокировано более одного веб-сайта. - person Josh; 30.08.2011
comment
Извините, я внимательно прочитал эту часть кода - вы правы. Просто из любопытства, действительно ли TIMEOUT ждет? Можете ли вы вывести значение% TIME% (до и после оператора тайм-аута) в файл TEMP, чтобы увидеть, обходит ли TIMEOUT ожидание? - person Arun; 30.08.2011
comment
@ Джош, как% мм% когда-нибудь будет старше 59? Разве это не просто чтение мм из чч: мм: сс.мс - person barlop; 30.08.2011
comment
@barlop Потому что, допустим, 6:30 и пользователь вводит 30 минут, тогда время будет 6:60 ... вот почему, если это произойдет, программа должна увеличить часы на 1 и сбросить минуты на 0 - person Josh; 01.09.2011
comment
@barlop, если вы проверите начало, у него есть пользовательский ввод для% mins%, поэтому, когда он выполняет математику в: SET, минута может увеличиваться более чем на 60. - person Anthony Miller; 01.09.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?

person Jim Davis    schedule 30.08.2011
comment
будьте осторожны при загрузке материалов с CNET в настоящее время (forum.ultravnc.net/viewtopic.php? f = 6 & t = 28692) fyi. Я загрузил приложение для редактирования видео несколько недель назад, и оно закрывало установку панели инструментов на рабочую станцию ​​... и у него не было функции удаления, его нужно было удалить вручную. - person Anthony Miller; 01.09.2011