批处理文件在一天中的某些时段循环VBScript

时间:2016-01-25 18:07:52

标签: windows batch-file

我是批处理的新手,所以请轻松一点。话虽这么说,我正在尝试编写一个批处理文件,每隔几分钟就会执行一个VBScript来更新我们网络上的信息。目前我有:

@ECHO OFF
REM Run VBScript
GOTO SKIP01
:LOOP    
wscript "C:\Users\Desktop\RenameMove.vbs"
GOTO SKIP01
:
:
:SKIP01
REM 3 Min Delay
PING 1.1.1.1 -n 10 -w 18000 >NUL
IF HOUR:%time:~0,5% <09:44
GOTO SKIP01
IF HOUR:%time:~0,5% >16:00
GOTO SKIP01
IF HOUR:%time:~0,5% >=09:45
GOTO LOOP

目前窗口将打开一两分钟,然后它就会关闭。如果我在删除第一个GOTO SKIP01后运行上面的内容,则VBScript会完美执行。然后有一个延迟,窗口关闭。我想,:SKIP01下的所有内容都会导致问题。我试图实现的功能是.BAT文件在16:01 - 09:44之间连续循环延迟。然后从09:45 - 16:00每3分钟运行一次VBScript。搜索论坛我还没有找到任何帮助。正如我所说,我对Batch来说很新。

RE:我上面的评论如下:

@ECHO OFF
setlocal enableextensions disabledelayedexpansion
set delay=180
set "startTime=09:45"
set "endTime=16:00"

:LOOP
set "now=%time: =0%"
:: ECHO It's %now%, waiting %delay% seconds
echo %date% %time% >> log.txt
if "%now%" geq "%startTime%:00,00" ( 
GOTO LOOP2
)

:LOOP2
set "now=%time: =0%"
:: ECHO It's %now%, waiting %delay% seconds
echo %date% %time% >> log.txt

if "%now%" lss "%endTime%:00,00" ( 

::       ECHO Start MSAccess
GOTO CALLVBS
)

:WAIT
REM 10 second delay
PING 127.0.0.1 -n %delay% >REM
GOTO LOOP


:CALLVBS    
echo Time to Move!
wscript "C:\Users\ljs\Desktop\Stock_Automation_DO_NOT_EDIT\RenameMove.vbs" 
GOTO WAIT

1 个答案:

答案 0 :(得分:1)

我重命名了一些东西,这对我来说更有意义,但这是一个有效的版本。延迟(以秒为单位)的顶部有变量以及窗口的开始和结束时间。在我看来,我还将你的ping延迟修改为更简单的东西。

删除生产中的回声并将vbscript文件添加到CALLVBS函数。

@ECHO OFF
setlocal enableextensions disabledelayedexpansion
set delay=180
set "startTime=09:45"
set "endTime=16:00"

:LOOP
  set "now=%time: =0%"
  ECHO It's %now%, waiting %delay% seconds
  if "%now%" geq "%startTime%:00,00" ( 
    ECHO It's after %startTime%
    if "%now%" lss "%endTime%:00,00" ( 
        ECHO And it's before %endTime%
        GOTO CALLVBS
    )
  )

:WAIT
  REM 10 second delay
  PING 127.0.0.1 -n %delay% >REM
  GOTO LOOP

:CALLVBS    
  echo It's time!
  REM Call VBS here
  GOTO WAIT

在这里发生了什么,正如一个几乎不知道他在说什么的人所解释的那样:

关于GOTO

首先,您需要知道批处理文件从上到下逐行处理,除非它遇到某些语句,如ifforgoto,其中最后一个是我们在这里关心的人。如果解释器遇到GOTO命令,它将转到相应的标签并逐行恢复处理代码直到找到另一个GOTO或到达文件的末尾

简单示例

@echo off
GOTO :FRUITS

:COLORS
echo Red
echo Green
GOTO :END

:FRUITS
echo Apple
echo Banana
GOTO :COLORS

:END
echo Done!

这输出以下内容:

Apple
Banana
Red
Green
Done!

BREAKDOWN

设置变量

@ECHO OFF
setlocal enableextensions disabledelayedexpansion
set delay=180
set "startTime=09:45"
set "endTime=16:00" 
     

这会设置一些设置并创建一些变量供以后使用。变量应该是自我解释的但是   如果你愿意,我可以详细说明。

检查时间

01. :LOOP
02.   set "now=%time: =0%"
03.   ECHO It's %now%, waiting %delay% seconds
04.   if "%now%" geq "%startTime%:00,00" ( 
05.      ECHO It's after %startTime%
06.      if "%now%" lss "%endTime%:00,00" ( 
07.          ECHO And it's before %endTime%
08.          GOTO CALLVBS
09.     )
10.   )
     

这是我们的&#34;循环&#34;。 :LOOP表示基本上标记的内容   代码部分,我们可以回到我们想要的任何时间。我称之为LOOP   因为这是我们一遍又一遍地做的部分。可能还有更多   准确地称之为:CHECKTIME或类似的东西,就像它的作用一样   标签对于口译员来说绝对没有任何意义,所以称之为&#34; LOOP&#34;   并不意味着它会重复。这可能是造成混乱的最大原因。

     

这是一个   逐步说明该块上每一行的作用(不处理   条件,只是一行一行):

     
      
  1. 获取当前时间。
  2.   
  3. 输出当前时间
  4.   
  5. 将当前时间与endTime变量进行比较。
  6.   
  7. 输出结果。
  8.   
  9. 将当前时间与startTimevariable进行比较。
  10.   
  11. 输出结果。
  12.   
  13. 转到代码的CALLVBS部分
  14.         

    请注意,我可以将GOTO WAIT放在此块的末尾,这可能更有意义,但由于:WAIT是下一个块   代码是接下来要处理的代码,所以GOTO会是   多余的!这可能是第二个混乱点。

稍等一下

:WAIT
  REM 10 second delay
  PING 127.0.0.1 -n %delay% >REM
  GOTO LOOP
     

这是只等待指定数量的代码部分   秒。它使用常见的ping命令来完成此操作   批量编程,因为没有内置延迟或睡眠命令   像其他语言一样。第一行只是评论,REM   意味着&#34;删除&#34; (我认为),你是如何评论代码行的   batch。事实上,我应该删除它,因为它   反正不是10秒:)。第二行ping localhost 180   时间(或延迟变量设置为的任何时间)。 >REM部分   意味着它输出ping的结果,好吧,我从未见过   &#34; REM&#34;这里。通常你会把它输出到nul,但不管怎样,它都是   确保你没有看到180 ping结果。现在,第3行   告诉处理器返回:LOOP标签。无论。   ping之后,它会再次执行:LOOP部分代码。

执行您的vbscript

:CALLVBS    
  echo It's time!
  REM Call VBS here
  GOTO WAIT
     

这是代码的:CALLVBS部分。首先它输出&#34;它   时间!&#34 ;.第二行是评论。如你所知,你   用你的vbscript替换它。在此之后,口译员被告知   转到代码的:WAIT部分。再次,它将永远这样做,   无论如何,在执行上面的行之后。