Code Monkey home page Code Monkey logo

autorun's Introduction

AutoRun

基于 Node.js / Python 的定时终端命令运行脚本.

AutoRun

使用Map键值对结构配置目标时间列表, 查找速度极快. 可自动根据当前时间来选择下一个目标时间, 自定义运行的命令, 可供Map键值对与for...of循环的学习参考.

使用方法

本脚本为了提高修改目标时间的效率, 使用config.json配置脚本的目标时间与命令.

配置

config.json配置目标时间, 以下是配置目标时间为7:20,7:45,7:50,8:008: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()函数打印, 我在调试的时候会用到它. 我用它把一些重要逻辑内变量的状态在调试的时候打印出来.

enabledebug

感言

2022下半年开学时间疫情变严重了, 然后开始了一段网课. 有一次我用虚拟声卡放了一次晚自习铃声, 班主任认为这挺好, 于是想让我去找一个打铃的软件.

结果, 找是找到了.但是免费版只能设置一个时间点, 全功能还需要付费. 找了半天, 不是无法配合虚拟声卡, 就是全功能需要付费.

于是我想: 干脆写一个吧.

一开始我用Python写了一个运用大量if判断目标时间的脚本, 但是设置时间的方法很笨拙, 修改一个目标时间可能需要改大量的if条件.

当时我想到JavaScriptMap键值 对可能适合被用在这里, 于是我用Node.js重写脚本, 然后就有了AutoRun.

鸣谢

感谢 某某Laba 不给我免费用, 单单打个铃竟然要付费. 他们不给我限制功能我就不会制作AutoRun, 多亏了它们的限制让我有了机会去提升我的编程技能.

感谢 rpONE 大佬纠正了用JavaScript的比较思维 写Python脚本的我.

不可能没看懂, 绝对不可能

感觉 MisaLiu 大佬解答了我在多处教程看不懂的setTimeOut()递归知识.

setTimeOut()递归知识

感谢 Toby Fox 制作的音乐 "sans."

autorun's People

Contributors

fbikdot avatar

Stargazers

 avatar lencx avatar  avatar XiYang6666 avatar

Watchers

 avatar

autorun's Issues

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.