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

Wra*_*Osu 6 random scripting batch-file scheduled-tasks

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

schtasks /create /tn "task" /tr c:\task.vbs /sc WEEKLY /d SUN /st 21:00:00 /ru ""
Run Code Online (Sandbox Code Playgroud)

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

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

选项1)

set /a num=%random% * (21 - 11 + 1) / 32768 + 11
Run Code Online (Sandbox Code Playgroud)

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

选项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
Run Code Online (Sandbox Code Playgroud)

该代码正确生成随机数,但我不知道如何将该数字插入到命令中,就像我想要的那样.我已经尝试用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
Run Code Online (Sandbox Code Playgroud)

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

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

%hour11-21%:%min00-59%:00
Run Code Online (Sandbox Code Playgroud)

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

Mat*_*son 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
Run Code Online (Sandbox Code Playgroud)

输出:

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 ""
Run Code Online (Sandbox Code Playgroud)