如何通过批处理文件随机安排任务?

时间:2014-04-08 15:28:27

标签: batch-file random scripting scheduled-tasks

我需要创建一个将在Windows 7计算机上通过.bat文件运行的脚本。 批处理文件将创建一个计划任务,该任务在星期日上午11点到晚上9点之间的随机时间运行。 我目前正在使用这个命令,我知道它只在特定时间有效:

schtasks /create /tn "task" /tr c:\task.vbs /sc WEEKLY /d SUN /st 21:00:00 /ru ""

我想随机化时间,以便我可以在所有400个系统中运行相同的批处理文件,并让每个系统在该范围内获得不同的时间,因此它们不会同时运行任务。我不在乎他们中的一些人是否有相同的时间,但我不希望所有400人都在同一时间内运行。 一旦我有一个按预期工作的单个批处理文件,它将被推送到所有系统并运行一次以安排该任务。

基于在这里搜索其他答案,我尝试使用以下脚本,现在只是尝试生成一个随机小时,但我没有得到我需要的结果:

选项1)

set /a num=%random% * (21 - 11 + 1) / 32768 + 11

该命令会在正确的范围内生成一个数字,但它并不是随机的,它似乎是基于时钟或其他东西,因为如果我快速运行它几次,我会得到相同的数字,然后它会增加随着时间的推移,这不会起作用。

选项2)

@echo off & setlocal EnableDelayedExpansion

for /L %%a in (1 1 20) do (
        call:rand 11 21
        echo !RAND_NUM!
) >> random2.txt

goto:EOF

REM The script ends at the above goto:EOF.  The following are functions.

REM rand()
REM Input: %1 is min, %2 is max.
REM Output: RAND_NUM is set to a random number from min through max.
:rand
SET /A RAND_NUM=%RANDOM% * (%2 - %1 + 1) / 32768 + %1
goto:EOF

该代码正确生成随机数,但我不知道如何将该数字插入到命令中,就像我想要的那样。我尝试用schtasks命令替换“>> random2.txt”,但它不起作用,我没有得到并反馈到日志文件中查看原因,我已经尝试过这样的:

@echo off & setlocal EnableDelayedExpansion

for /L %%a in (1 1 1) do (
        call:rand 11 21
        echo !RAND_NUM!
)
schtasks /create /tn "task" /tr c:\task.vbs /d SUN /sd 10/28/2012 /st %RANDOM%:00:00 /ru "" > task.txt 2>&1
goto:EOF

REM The script ends at the above goto:EOF.  The following are functions.

REM rand()
REM Input: %1 is min, %2 is max.
REM Output: RAND_NUM is set to a random number from min through max.
:rand
SET /A RAND_NUM=%RANDOM% * (%2 - %1 + 1) / 32768 + %1
goto:EOF

因此,我尝试使用%RANDOM%var作为命令的小时组件。

完美的解决方案将为小时部分生成11到21之间的随机两位数字,然后在命令的分钟部分生成介于00和59之间的两位数字,并在它们之间按照格式的要求使用冒号命令 所以schtasks命令的时间部分看起来像这样:

%hour11-21%:%min00-59%:00

我希望我在这里给出了足够的细节,谁能告诉我我做错了什么?有更简单的方法吗? 提前谢谢!

3 个答案:

答案 0 :(得分:4)

试试这个:

@echo off
setlocal enabledelayedexpansion
call :rand 1 1 dummy
call :rand 11 21 ret
call :rand 0 59 ret2
if %ret2% LSS 10 set ret2=0%ret2%
echo schtasks /create /tn "task" /tr c:\task.vbs /d SUN /sd 10/28/2012 /st %ret%:%ret2%:00 /ru "" > task.txt 2>&1
exit /b

:rand
setlocal
SET /A RAND_NUM=%RANDOM% * (%2 - %1 + 1) / 32768 + %1
endlocal & set %~3=%RAND_NUM%
exit /b

输出:

schtasks /create /tn "task" /tr c:\task.vbs /d SUN /sd 10/28/2012 /st 11:00:00 /ru ""

U:\Scripts\Batch>RandomNumBetween.cmd
schtasks /create /tn "task" /tr c:\task.vbs /d SUN /sd 10/28/2012 /st 16:7:00 /ru ""

U:\Scripts\Batch>RandomNumBetween.cmd
schtasks /create /tn "task" /tr c:\task.vbs /d SUN /sd 10/28/2012 /st 17:46:00 /ru ""

U:\Scripts\Batch>RandomNumBetween.cmd
schtasks /create /tn "task" /tr c:\task.vbs /d SUN /sd 10/28/2012 /st 19:35:00 /ru ""

U:\Scripts\Batch>RandomNumBetween.cmd
schtasks /create /tn "task" /tr c:\task.vbs /d SUN /sd 10/28/2012 /st 13:54:00 /ru ""

U:\Scripts\Batch>RandomNumBetween.cmd
schtasks /create /tn "task" /tr c:\task.vbs /d SUN /sd 10/28/2012 /st 14:51:00 /ru ""

U:\Scripts\Batch>RandomNumBetween.cmd
schtasks /create /tn "task" /tr c:\task.vbs /d SUN /sd 10/28/2012 /st 21:48:00 /ru ""

答案 1 :(得分:1)

我解决了它:

set /a H=%random% * (21 - 11 + 1) / 32768 + 11

set /a M=%random% * (59 - 11 + 1) / 32768 + 11

H = Hour

M = Minute

然后使用

创建计划任务

SCHTASKS /创建/ RU“NT AUTHORITY \ SYSTEM”/ SC每周/ D FR / ST%H%:%M%

电贺, 丹。

答案 2 :(得分:0)

设置/ a命令太复杂了。将% =“ remainder”用作正值,类似于“ modulo”。即使它在短时间内仅将“向上”计数为1,也避免使用/ 32768使其变得更加随机,因为我似乎也具有“不像我想的那样随机”的效果。 在.CMD中使用模数时,您需要使用双%,因此我们以三%

结尾
:hour 11:00 until 21:00
set /a HOUR=%RANDOM%%%11+11
:minute 0-59
set /a MINUTE=%RANDOM%%%60
schtasks /create /tn "task" /tr c:\task.vbs /sc WEEKLY /d SUN /st %HOUR%:%MINUTE%:00 /ru ""