Windows日常任务自动化方案

Posted on 2024-08-08

一直以来我都对自动实现重复的任务感兴趣,也使用Python和Windows Bat写过一些小工具,包括定时自动预约xxx,连点器、自动切换wifi等等,虽然这些脚本都比较简单,但是还是给我带来了足够的成就感。

今天我想分享一下我在Windows下的日常任务自动化方案,主要是基于AutoHotKey和Powershell。

起源——Git Alias

Git可谓是程序员的必备工具之一,但日常使用到的命令就那么几个,而且都还挺长的,一方面是难记,另一方面是每次敲那么多实在是受不了。后来在一个Git教程中发现了Git的Alias,试用了一下简直不要太爽。

但在Windows下,似乎只有在git bash里用起来体验还算不错,在VSCode的终端(cmd/powershell)里就不太好用了,于是就发现了Powershell自定义函数的功能,才解决了windows下难以使用git alias的问题。(并且成功让我抛弃了cmd投入powershell的怀抱)

大概的使用流程如下:

先在$HOME\Documents\WindowsPowerShell文件夹下创建一个Microsoft.PowerShell_profile.ps1文件

如果有这个文件直接在里面加内容就行。

$HOME其实就是C:\Users\用户名,可以在Powershell中输入echo $HOME查看。

随后就可以在这个文件里面快乐地定义函数了。

以下是我用的git alias的一些函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function gst {git status}
function ggph {git log --graph}
function ggpha {git log --graph --all}
function gad {git add -A}
function gcam {
    git commit -am $args[0]
}
function grst {
    if ($args[0]) {
        git reset --hard $args[0]
    } else {
        git reset --hard
    }
}

而且为了方便快速的打开这个配置文件,还可以添加一个函数:

1
2
3
function show-profile {
    code $profile
}

也就是用VSCode打开咱们的配置文件。 只需要在powershell中输入show-profile就可以打开这个文件了。

更加强大的自动化工具——AutoHotKey

AutoHotKey是一个强大的自动化工具,可以实现键盘鼠标的模拟,窗口的控制等等。我是偶然在B站上刷到了介绍它的视频才了解到有这么一个工具的存在,随后我立马着手写了一个小工具来体验一下。

AutoHotKey的使用流程是相当简洁的,很容易上手,其实就是安装了autohotkey软件后,新建一个.ahk后缀的文件,并依据ahk的语法编写自己的代码(其实就和平时写代码一样),双击这个文件就可以直接运行,十分方便。

这里贴一个AutoHotKey中文文档,感兴趣的可以去看一下。

随后我通过我自己实现的一个小工具对AutoHotKey进行一个简单的介绍:

最近正在参加一个炼丹比赛,主办方提供了环境和客户端,并且只能用他们的客户端跑代码收集数据,每次训练都要手动启动Docker,再启动客户端,再进行一系列鼠标点击才能开始训练,多搞几次真的让人心烦。

AutoHotKey的出现让我有机会能够自动化实现这个过程。

首先我将任务分成两个部分:

  1. (检查)启动Docker和客户端;
  2. 在客户端中自动实现点击操作;jok

第一个部分实际上就是运行两个应用,这一部分我在前面提到的powershell脚本里实现了:

这里就不再过多介绍,具体的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
function train {
    # 检查 Docker 是否运行
    $dockerProcess = Get-Process -Name "docker*" -ErrorAction SilentlyContinue
    if ($dockerProcess) {
        Write-Host "Docker is already running."
    } else {
        # 启动 Docker
        Start-Process "\path\to\docker.exe"
        Write-Host "Docker has been started."
        Start-Sleep -Seconds 7
    }

    # 检查开悟客户端是否运行
    $clientProcess = Get-Process -Name "ClientToRun*" -ErrorAction SilentlyContinue
    if ($clientProcess) {
        Write-Host "Client is already running."
    } else {
        # 启动 客户端
        Start-Process "\path\to\client.exe" -WindowStyle Hidden
        Write-Host "Client has been started."
        Start-Sleep -Seconds 7
    }
    # 启动AutoHotKey训练脚本
    Start-Process "\path\to\autohot\key\script.ahk"
}

接下来就该AutoHotKey排上用场了,AutoHotKey的安装过程可以自行搜索。

下面展示部分代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
clientWindow := "Client"
WinWait clientWindow
WinActivate clientWindow
CenterWindow(WinTitle)
{
    WinGetPos ,, &Width, &Height, WinTitle
    WinMove (A_ScreenWidth/2)-(Width/2), (A_ScreenHeight/2)-(Height/2),,, WinTitle
}
CenterWindow(clientWindow)
localTrainPath := "\path\to\img.bmp"
WinGetClientPos &X, &Y, &W, &H,clientWindow
if (ImageSearch(&a, &b, 0, 0, W, H, "*4 " localTrainPath) or ImageSearch(&a, &b, 0, 0, W, H, "*4 " localTrain2Path)) 
  Click a, b
else {
  MsgBox "No Local Train"
  Return
}

这段代码十分简洁,也体现了AutoHotKey的易用性

首先需要给定你要控制的窗口名字(鼠标划到任务栏的窗口标签上就能看到,这里名字一定要完整)。 WinWait的作用是等待窗口出现,也就是应用被启动(这里其实也可以在ahk文件中运行应用,但之前在powershell里实现了,这里就不再重复)。

WinActive的作用可以理解成用鼠标点击了一下这个窗口,获得焦点。 CenterWindow的作用是将窗口在整个屏幕中居中,可以避免窗口被遮挡的情况。

随后就是AutoHotKey对我来说最惊艳的地方,它提供了图像搜索函数,也就是你可以预先给定一个图片文件(最好是bmp格式的,其他格式的可以去随便找个网站转称bmp),然后在窗口中搜索这个图片对应的坐标,知道坐标之后就可以进行点击了。

至此完成了自动客户端点击,那么很多自动化任务就已经可以实现了。

总结

这篇文章对我最近发现的自动化工具进行了简单的介绍,对AutoHotKey使用的介绍也比较浅薄,实际上AutoHotKey的强大并未完全体现,感兴趣的强烈建议上手体验!!