自动化脚本:把重复劳动交给机器去做

自动化不是为了显得厉害,而是为了把你从「每周都要重复做一遍」的事情里捞出来。

自动化不是为了显得厉害,而是为了把你从「每周都要重复做一遍」的事情里捞出来。

我做过一个粗略的统计:每天重复性的电脑操作加起来大概有四十分钟——整理下载文件夹、把截图按日期改名、把日志文件归档、备份某个目录、把 Excel 导出成 CSV。这些事单独看每件只要几分钟,但一年下来是两百多个小时。

所以后来我开始写脚本。这篇文章不讲「脚本编程入门」,而是讲哪些事值得自动化、用什么工具做、以及怎么不把自动化本身变成新的负担。全部都是我真在做的事情。

先说结论:值得自动化的事情有三个特征——重复频率高、步骤明确、出错代价不高。如果一件事一年只做一次,或者每一步都需要人判断,那手动做反而更省事。


🧭 先选对工具:三个层级的方案

很多人一上来就学 Python,其实对于简单任务,系统自带的东西就够了。工具选得越轻,维护成本越低。

层级工具适合什么学习成本
系统自带Windows 批处理 / PowerShell、macOS/Linux Shell 脚本复制、移动、改名、简单条件判断低,但要查语法
脚本语言Python需要处理文件内容、调用接口、复杂逻辑
定时调度Windows 任务计划程序、cron让脚本按时间自动跑

我的实际用法是:能用 PowerShell/Shell 解决的绝不上 Python,能用 Python 一行解决的绝不写成一个项目。因为脚本越简单,你三个月后回来看还看得懂,改起来也快。

🪟 PowerShell 和批处理:Windows 上的日常活用

批处理(.bat)是老古董,语法别扭,但胜在到处都能跑。PowerShell 强大得多,能直接调 .NET,处理文本和文件也顺手。我不建议为了自动化去啃完整的 PowerShell,学会下面几类操作就够用大半年。

批量重命名:把步骤写死,别每次手动改

这是我用得最多的场景。比如下载文件夹里堆了一堆截图,名字是各种杂乱字符串,我想按修改时间顺序重命名成「屏幕截图_001」这种格式。

# 按最后修改时间排序,重命名为 截图_001.jpg 这种格式
$i = 1
Get-ChildItem -Path .\*.png | Sort-Object LastWriteTime | ForEach-Object {
    $newName = "截图_{0:D3}.png" -f $i
    Rename-Item -Path $_.FullName -NewName $newName
    $i++
}

关键点是先加一个「-WhatIf」参数试运行:PowerShell 很多命令支持 -WhatIf,会打印出「如果执行会发生什么」但不真的动手。批量操作前跑一遍,能避免灾难。

# 只预览不执行,确认无误再去掉 -WhatIf
Rename-Item -Path .\old.txt -NewName new.txt -WhatIf

按规则整理文件夹

我的下载文件夹曾经是个灾难。后来写了个按扩展名分流的脚本:图片进 images、文档进 docs、安装包进 installers、压缩包进 archives。

$rules = @{
    ".jpg" = "images"; ".png" = "images"; ".webp" = "images"
    ".pdf" = "docs";  ".docx" = "docs"; ".xlsx" = "docs"
    ".exe" = "installers"; ".msi" = "installers"
    ".zip" = "archives"; ".7z" = "archives"; ".rar" = "archives"
}

Get-ChildItem -File | ForEach-Object {
    $target = $rules[$_.Extension.ToLower()]
    if ($target) {
        $dir = Join-Path . $target
        if (-not (Test-Path $dir)) { New-Item -ItemType Directory -Path $dir | Out-Null }
        Move-Item -Path $_.FullName -Destination $dir -WhatIf
    }
}

这种脚本的价值在于你只需要写一次,之后每天或每周跑一下,下载文件夹永远保持整洁。

🐍 Python:需要动脑子的时候用它

什么时候该上 Python?当你的任务需要读文件内容、做判断、调用网络接口、处理图像或表格的时候。举几个我真实写过的例子。

例子一:批量提取和重写文件名中的日期

我有一批照片,文件名里带着拍摄时间戳,格式混乱。用 Python 的字符串处理加正则,几十行就能统一格式。

import os, re
from pathlib import Path

pattern = re.compile(r"(\d{4})-(\d{2})-(\d{2})")

for f in Path("photos").iterdir():
    m = pattern.search(f.name)
    if m:
        new = f"IMG_{m.group(1)}{m.group(2)}{m.group(3)}{f.suffix}"
        f.rename(f.with_name(new))
        print(f"{f.name} -> {new}")

这类脚本的关键是先 print 出来看看,确认无误再真的 rename。批量改名的脚本一旦出错,恢复起来很麻烦。

例子二:批量处理 Excel 数据

如果有一堆结构相同的 Excel 需要合并、筛选、导出,用 pandas 几行就能搞定。我每个月要做一次的数据汇总,原本手动操作要半小时,现在跑脚本几秒钟。

import pandas as pd
from pathlib import Path

frames = [pd.read_excel(f) for f in Path("reports").glob("*.xlsx")]
merged = pd.concat(frames, ignore_index=True)

# 按条件筛选后导出
result = merged[merged["状态"] == "已完成"]
result.to_excel("汇总.xlsx", index=False)

⏰ 让它自己跑起来:cron 与任务计划程序

脚本写好了,如果还要你手动双击运行,那自动化只完成了一半。真正的自动化是定时触发

Windows:任务计划程序

打开「任务计划程序」,创建基本任务,设置触发时间(每天几点、开机时、或者某个事件发生时),然后指定要运行的脚本。一个一定要勾的选项是「不管用户是否登录都要运行」,否则你锁屏的时候脚本就停了。

还有个常见的坑:任务计划程序里运行的 PowerShell 脚本路径要用绝对路径,而且默认的工作目录可能和你想的不一样。稳妥的做法是在脚本开头自己 Set-Location 到你期望的目录。

Linux / macOS:cron 和 launchd

cron 是老牌定时工具,语法是「分 时 日 月 周 命令」。用 crontab -e 编辑。

# 每天凌晨 3 点备份一次项目目录
0 3 * * * /home/user/scripts/backup.sh >> /home/user/logs/backup.log 2>&1

这里有两个细节很关键:第一,命令要用绝对路径,因为 cron 的环境变量和你登录后不一样;第二,把输出重定向到日志文件,否则脚本失败了你会完全不知道。

macOS 现在推荐用 launchd 替代 cron(通过 plist 文件配置),但它比 cron 麻烦不少,日常任务用 cron 基本还能跑。如果只是简单需求,也可以用系统自带的「日历」闹钟触发脚本,或者用 Hazel 这类自动化工具实现「文件一变就执行」的规则。

自动化的第一原则:让它在你不看的时候也能安全失败。所有定时任务都应该把日志写下来,并且定期检查一次。一个悄悄失败的备份脚本,比没有备份更危险。

🧱 几个避免踩坑的原则

  1. 先手动做三遍,再写脚本。如果你自己都说不清步骤,脚本一定会出错。手动做三遍能暴露所有边缘情况。
  2. 破坏性操作先试运行。删文件、改名、覆盖,一律先在副本目录上跑一遍。
  3. 给脚本加注释和日期。三个月后的你等于另一个人,他不记得这个脚本是干什么的。
  4. 不要过度自动化。如果一个脚本的维护成本超过了它节省的时间,就删掉它,老老实实手动做。

📌 小结

我的建议是从最小的一步开始:挑一件你每周都在重复做的事,用最简单的工具写成脚本。可以是整理下载文件夹,可以是按日期归档截图。跑通一次之后,你会对「自动化」这件事建立信心,然后自然地扩展到更多场景。

别忘了那句老话:好的自动化不是让你变得更忙,而是让你有时间去做那些真正需要脑子的事。工具只是手段,把重复的部分交给机器,把判断的部分留给自己。


今天下班前,花二十分钟写下你这周做过的重复操作,挑出最烦的那一件,试着让机器替你做完它。

给TA加油
共{{data.count}}人
人已加油
0 条回复 A文章作者M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信私信列表
搜索
-->