我是批处理的新手,所以请轻松一点。话虽这么说,我正在尝试编写一个批处理文件,每隔几分钟就会执行一个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
答案 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
在这里发生了什么,正如一个几乎不知道他在说什么的人所解释的那样:
首先,您需要知道批处理文件从上到下逐行处理,除非它遇到某些语句,如if
,for
或goto
,其中最后一个是我们在这里关心的人。如果解释器遇到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!
@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; 并不意味着它会重复。这可能是造成混乱的最大原因。这是一个 逐步说明该块上每一行的作用(不处理 条件,只是一行一行):
- 获取当前时间。
- 输出当前时间
- 将当前时间与endTime变量进行比较。
- 输出结果。
- 将当前时间与startTimevariable进行比较。
- 输出结果。
- 转到代码的
醇>CALLVBS
部分请注意,我可以将
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
部分代码。
:CALLVBS echo It's time! REM Call VBS here GOTO WAIT
这是代码的
:CALLVBS
部分。首先它输出&#34;它 时间!&#34 ;.第二行是评论。如你所知,你 用你的vbscript替换它。在此之后,口译员被告知 转到代码的:WAIT
部分。再次,它将永远这样做, 无论如何,在执行上面的行之后。