基于 Node.js / Python 的定时终端命令运行脚本.
使用Map
键值对结构配置目标时间列表, 查找速度极快. 可自动根据当前时间来选择下一个目标时间, 自定义运行的命令, 可供Map
键值对与for...of
循环的学习参考.
本脚本为了提高修改目标时间的效率, 使用config.json
配置脚本的目标时间与命令.
在config.json
配置目标时间, 以下是配置目标时间为7:20
,7:45
,7:50
,8:00
和8:30
的示范:
"timeList":[
[7, [20, 45, 50]],
[8, [0, 30]]
],
在config.json
配置运行的命令, 以下是配置目标命令为
mpv main.mp3
的示范: 请注意转义
"playCmd":"mpv main.mp3"
在config.json
配置关闭进程用的命令
"processKillCmd":"taskkill /F /IM mpv.com /T"
不需要的话可以设置为false
.
"processKillCmd":false
在config.json
配置等待时间, 单位为毫秒. 以下为设置等待时间为60000
毫秒(及1分钟)的示范:
"timeOut":60000
等待时间默认为1000
毫秒(及1秒), 如果小于默认时间则自动归正为1000
毫秒.
用node运行autorun.js
node autorun.js
大功告成!
以下为实现定时执行命令功能的原理
通过for...of
循环遍历每一个key
.
正常情况下将与当前小时相等的key
所对应的value
数组内的元素 与当前分钟比较, 继而选择下一目标时间.
第二种情况. 如果当前小时相等的key
所对应的value
数组内的数字 没有一个比当前分钟大, 则选择下一key
所对应的value
数组内的第一个元素.
所以, 如果在
config.json
中没有按照顺序设置timeList键值对中用于设置小时的部分, 那么就可能会导致第二种情况发生后目标小时没有被正确选择, 或者目标分钟为undefined
, 后者可能会导致脚本认为"目标时间均已过"然后结束脚本.
(目标小时 - 当前小时 ) × 60 + (目标分钟 - 当前分钟) = 剩余分钟
算出剩余时间, 然后每隔一分钟将剩余时间对比一次, 如果剩余时间不大于一就一秒对比一次.
如果剩余时间对比0为true
,及剩余时间为0, 就用子进程执行设置的命令.
为了防止命令结束后马上递归会再次运行让子进程运行命令, 脚本运行完子进程后等待所设置的等待时间后关闭子进程.
可以在源码中声明run
函数与执行run
函数的中间设置自定义时间规则.
星期的变量day
已经声明好了, 星期日为0
, 星期一为1
, 以此类推.
以下为星期五特别时间设置, 星期六停止脚本, 星期天取消小时小于19的时间 的示范:
function run() {
targetTime = getTargetTime();
main();
};
// ========== 自定义时间规则开始 ==========
if (day == 5) {
debugConsoleLog("星期五");
timeList.set(15, [0, 50]);
timeList.set(16, [0, 40]);
} else if (day == 6) {
console.log("\033[31m[WARN]\033[0m" + "星期六,停止脚本");
} else if (day == 1) {
debugConsoleLog("星期日");
for (let i = 0; i < 19; i++) {
timeList.delete(i);
};
};
// ========== 自定义时间规则结束 ==========
run();
在config.json
中配置enabledebug
的值为true
可以使debugConsoleLog()
函数打印, 我在调试的时候会用到它. 我用它把一些重要逻辑内变量的状态在调试的时候打印出来.
2022下半年开学时间疫情变严重了, 然后开始了一段网课. 有一次我用虚拟声卡放了一次晚自习铃声, 班主任认为这挺好, 于是想让我去找一个打铃的软件.
结果, 找是找到了.但是免费版只能设置一个时间点, 全功能还需要付费. 找了半天, 不是无法配合虚拟声卡, 就是全功能需要付费.
于是我想: 干脆写一个吧.
一开始我用Python
写了一个运用大量if
判断目标时间的脚本, 但是设置时间的方法很笨拙, 修改一个目标时间可能需要改大量的if
条件.
当时我想到JavaScript
的 Map
键值 对可能适合被用在这里, 于是我用Node.js
重写脚本, 然后就有了AutoRun
.
感谢 某某Laba 不给我免费用, 单单打个铃竟然要付费. 他们不给我限制功能我就不会制作AutoRun
, 多亏了它们的限制让我有了机会去提升我的编程技能.
感谢 rpONE 大佬纠正了用JavaScript
的比较思维 写Python
脚本的我.
感觉 MisaLiu 大佬解答了我在多处教程看不懂的setTimeOut()
递归知识.
感谢 Toby Fox 制作的音乐 "sans."