Windows 批处理命令冲突

Windows 批处理命令冲突,windows,batch-file,batch-processing,Windows,Batch File,Batch Processing,我制作了这个批处理脚本,它允许用户输入网站的URL以及以分钟为单位的时间,然后将URL添加到主机文件中,并在时间到期后将其删除。(在一定时间内有效阻止网站) 它通过在第一次运行时创建另一个批处理文件从主机文件中删除网站,然后使用AT命令在指定时间启动新的批处理文件。它在阻止多个网站时起作用,唯一的问题是如果多个网站同时被设置为取消阻止,则创建的每个新批处理文件的取消阻止过程似乎会发生冲突。正如您将看到的,我试图通过延迟批处理文件的运行来修复此问题,直到另一个批处理文件完成。不幸的是,它大部分时间

我制作了这个批处理脚本,它允许用户输入网站的URL以及以分钟为单位的时间,然后将URL添加到主机文件中,并在时间到期后将其删除。(在一定时间内有效阻止网站)

它通过在第一次运行时创建另一个批处理文件从主机文件中删除网站,然后使用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
@echo关闭
标题站点拦截器
集合名称=%random%
设置/P url=进入网站(如www.facebook.com)——
SET/P mins=您要将其阻止多少分钟?:
后藤:设定
:背
在%hh%:%mm%C:\Users\%username%\downloads\%name%.bat
回声。>>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
如果存在,则回显C:\Users\Downloads\temp1.txt转到:等待>>C:\Users\%username%\Downloads\%name%.bat
echo echo不删除^>^>C:\Users\Downloads\temp1.txt>>C:\Users\%username%\Downloads\%name%.bat
echo find/v“%url%”^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主机>>C:\Users\%username%\downloads\%name%.bat
回显副本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
回声超时3>>C:\Users\%username%\downloads\%name%.bat
echo GOTO:TOP>>C:\Users\%username%\downloads\%name%.bat
出口
:设置
设置/a mm=%time:~3,2%
设置/a hh=%time:~0,2%
如果%mm%gtr 60转到:检查
设置/a毫米=%mm%+%min%
:完成
如果%mm%gtr 60转到:检查
如果%mm%==60套/a hh=%hh%+1套/a mm=00
后藤:回来
出口
:检查
如果%mm%gtr 60套/a hh=%hh%+1
如果%mm%gtr 60套/a毫米=%mm%-60和转到:完成
后藤:完成了

(该程序必须以管理员身份运行才能工作。因此,我将其编译为.exe并添加管理员清单。编译为.exe不是问题,尽管我在运行批处理或编译的.exe时也有同样的问题)

我怀疑脚本中是否存在这样的问题,该脚本似乎被广泛使用:

if %mm% gtr 60...

如果检查时间大于60分钟,我想这可能是您出现问题的原因。分钟值可以是0到59,而不是60。

我认为它不会解决问题,但是如果您不创建辅助文件,只使用原始文件和参数来指示删除,它可能会使读取/管理更容易

例如(未经测试,停车场):


你用什么把它编译成.EXE?

我从中得到了一些乐趣。。。既然你还没有标出答案,我想你可能会想看看。看来你的主要问题是你想能够阻止多个网站,并让他们在同一时间解除阻止正确吗

使用你的方法,我修改了一个动态循环批处理,这将允许你添加尽可能多的网站,以暂时禁止你想要的。这样,一次只能有一个批访问主机文件。它还可以在摆脱自身之前清除它所创造的一切。希望这有助于:

@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
@echo关闭
标题站点拦截器
setlocal EnableDelayedExpansion
集合名称=%random%
SET/P count=需要阻止多少个网站?:
SET/P mins=您要阻止它们多少分钟?:
设置N=0
:URL\u循环
设置/a N+=1
如果!N全球技术法规!计数后藤集
设置/P url%N%=进入网站(如www.facebook.com)-
转到URL\u循环
:背
schtasks/create/sc ONCE/tn%name%/TR C:\Users\%username%\downloads\%name%.bat/st%hh%:%mm%
设置N=0
:主机循环
设置/a N+=1
如果!N全球技术法规!计数转到结束\u主机\u循环
回声。127.0.0.1 !url%N%!>>C:\Windows\System32\drivers\etc\hosts
转到主机循环
:结束\u主机\u循环
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
回显副本C:\Windows\System32\drivers\etc\hosts C:\temp1.txt>>C:\Users\%username%\downloads\%name%.bat
设置N=0
设置M=1
:查找循环
设置/a M+=1
设置/a N+=1
如果!N全球技术法规!计数转到结束\u查找\u循环
echo find/v“!url%N%!”^C:\temp%M%.txt>>C:\Users\%username%\downloads\%name%.bat
echo del C:\temp%N%.txt>>C:\Users\%username%\downloads\%name%.bat
转到查找循环
:结束\u查找\u循环
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
设置N=0
:MSG_循环
设置/a N+=1
如果!N全球技术法规!计数转到END_MSG_循环
回声味精*!url%N%!取消阻止>>C:\Users\%username%\downloads\%name%.bat
转到MSG_循环
:END\u MSG\u循环
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%\download
@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