我学编程的方式和大多数人不太一样——我不是从”学一门语言”开始的,而是从”解决一个问题”开始的。

最早写脚本是因为一个很蠢的场景:我需要把一批图片的文件名从 IMG_001.JPG 改成 2026-07-15-北京-001.jpg。用鼠标一个个重命名,20 张图就烦了。上网搜了一下,发现一个叫 ren 的命令(Windows)能批量改名。但那语法太绕了,后来换成 PowerShell 一行搞定。

那以后,每次遇到重复劳动,我的第一反应不再是”忍一下手动做”,而是”能不能写个脚本”。

这个方法比任何编程课都有效。不是因为脚本多厉害,而是因为有真实的问题等你解决,你不会学到一半就放弃。

从最无聊的事开始

如果你没写过脚本,最简单的入门方式不是买书,而是找一个你每周至少做一次、每次超过 5 分钟的重复操作

我说几个我身边真实的例子:

批量重命名文件。 相机导出的照片叫 DSC0001.ARW,毫无意义。改成 2026-07-20-颐和园-01.arw,一眼就知道是什么。用 PowerShell 写个脚本,参数化日期和地点,每次拍完照跑一遍。

批量压缩图片。 这个博客用的 WebP 转换脚本 就是这么来的。手动一张张转太慢,写个脚本遍历目录,自动转,顺便把原图移到备份目录。

整理下载文件夹。 我下载文件夹常年几百个文件,1 写了个脚本按文件类型分类归档——.pdf文档/.zip压缩包/.exe安装包/,按修改日期再分一层。每个月跑一次,桌面再也没乱过。

这些事情单个看都很小,但累积起来,每周省 10 分钟,一年就是 8 个多小时。而且脚本不会忘、不会累、不会手滑删错文件。

不用学一门语言,够用就行

很多人觉得写脚本得先学会 Python 或 JavaScript,这不是事实。

你的操作系统自带了一个脚本环境:

  • Windows:PowerShell(比 CMD 强太多了,对象管道、.NET 都能调)
  • macOS/Linux:Bash/Zsh(系统自带,文本处理一绝)

这三个环境覆盖了 95% 的日常自动化需求。而且你不需要背语法,每次写的时候查就行:

我的日常搜索习惯

每次写脚本遇到不会的,我就搜:

  • “powershell 批量重命名 正则”
  • “bash 遍历目录 文件名替换”
  • “powershell 压缩 zip 文件夹”

人脑不是文档,不需要记住所有 API。记住有这个东西就行了,具体语法搜索引擎解决。

等你觉得 PowerShell/Bash 不够用了——比如要处理 JSON API、爬网页、操作 Excel——再上 Python。而且那时候你学 Python 会快很多,因为你知道自己要解决什么问题,而不是对着语法书发呆。

我的”脚本进化史”

第一阶段是单行命令。没有文件,每次现写现用:

# 把当前目录所有 .png 转成 .webp(需要 ImageMagick)
Get-ChildItem *.png | ForEach-Object { magick convert $_.Name $_.BaseName + '.webp' }

第二阶段是保存成 .ps1 文件。因为发现同一个功能要反复写:

# resize-photos.ps1
param(
  [string]$Path = ".",
  [int]$Width = 1920
)
Get-ChildItem $Path -Include *.jpg, *.png -Recurse | ForEach-Object {
  magick convert $_.FullName -resize $Width $_.FullName
  Write-Host "已处理: $($_.Name)"
}

第三阶段是加参数和错误处理。因为脚本开始给别人用了(其实就是我自己三个月后回来用):

# backup-blog.ps1
$source = "D:\ruanjian\code\github_project\CloakBlog"
$backupDir = "D:\backups\blog"
$date = Get-Date -Format "yyyy-MM-dd"

# 检查源目录是否存在
if (-not (Test-Path $source)) {
  Write-Error "源目录不存在: $source"
  exit 1
}

# 创建备份目录
New-Item -ItemType Directory -Path "$backupDir\$date" -Force | Out-Null

# 排除 node_modules 之类的目录
$exclude = @('node_modules', '.git', 'dist')
Get-ChildItem $source -Exclude $exclude | Copy-Item -Destination "$backupDir\$date" -Recurse -Force

Write-Host "备份完成: $backupDir\$date"

这个「三阶段进化」不是计划出来的,是需求驱动的。刚开始觉得单行够用,后来发现重复写太烦,就保存成文件。再后来发现没有参数和错误提示,三个月后自己都看不懂——于是老老实实加了 help 注释。

一个完整的例子:博客图片优化脚本

拿这个博客的真实需求来说。每次写文章配图,流程是这样的:

  1. 把截图/照片丢进 public/img/
  2. 转换成 WebP 格式
  3. 压缩到合理大小(不压缩一张截图能 2MB,压缩后 200KB)
  4. 生成一个适合文章引用的路径列表

一开始我每次都手动执行 ImageMagick 命令,后来写了一个脚本:

# optimize-blog-images.ps1
param(
  [string]$SourceDir = ".\public\img",
  [int]$Quality = 80,
  [int]$MaxWidth = 1920
)

$totalSaved = 0
$processed = 0

Get-ChildItem $SourceDir -Include *.png, *.jpg, *.jpeg | ForEach-Object {
  $output = $_.DirectoryName + "\" + $_.BaseName + ".webp"

  # 如果 WebP 已存在且更新,跳过
  if ((Test-Path $output) -and ($_.LastWriteTime -lt (Get-Item $output).LastWriteTime)) {
    return
  }

  $beforeSize = $_.Length
  magick convert $_.FullName -resize $MaxWidth -quality $Quality $output
  $afterSize = (Get-Item $output).Length

  Write-Host "$($_.Name)$($_.BaseName).webp (节省 $([math]::Round(($beforeSize - $afterSize) / 1KB)) KB)"
  $totalSaved += $beforeSize - $afterSize
  $processed++
}

Write-Host "`n处理完成: $processed 个文件,共节省 $([math]::Round($totalSaved / 1MB, 2)) MB"

这个脚本并不复杂——遍历文件、跳过已处理的、调用 ImageMagick 转换、输出统计。但它每次运行都在给我省时间。

你的第一个脚本也不需要复杂。写一个能帮你省 5 分钟的脚本,就算成功。

一些可以写的方向

如果你实在想不出脚本能干什么,这里列一些我写过或者认识的人写过的:

  • 备份脚本:备份配置文件、博客、笔记到外置硬盘 / 网盘
  • 截图整理:桌面的截图自动按年月归档
  • 批量转码:视频/音频批量转格式(配饭的 FFmpeg 一绝)
  • 日志清理:删除超过 N 天的临时文件和日志
  • Git 辅助:一键创建 feature 分支、同步 fork、清理已合并分支
  • 定时截图:每隔一小时截屏一次,回顾一天的时间花在哪了

核心原则 :从你已经在做的事情里找一个最烦的,把它自动化。1 小时之内搞不定的话,说明选的目标太大了,换个更小的。

不是每件事都值得自动化

写脚本也有成本。维护它、调试它、偶尔还要适配环境变化。有时候手动做一次十分钟,但写脚本要花两小时,而且一年只用两三次——这种就不值得自动化。

我有个判断标准:“三三法则”

如果一件事满足以下两条,就值得写脚本:

  • 三次原则:同一操作做了三次以上
  • 三秒原则:手动操作需要三秒以上才能完成
  • 三个月原则:这件事在未来三个月内还会再出现

满足两条就写脚本,满足一条就再想想,一条都不满足就手动做。

最有用的编程课是你自己的需求

我见过太多人学编程的方式是:找一门语言的入门教程,从变量、函数、对象一路啃到高阶用法,然后——就没有然后了。因为没有真实场景去用,学完就忘。

写脚本是反过来的:你有个具体问题,不懂语法?现查。不会设计?抄别人改。没用过正则?只在这次需要的时候学。每一个知识点都是因为要用才学的,学了立刻就产生价值。

这种正反馈是持续学习的核心动力。而且你积累的每一个脚本——不管多小——都是在给你的未来省时间。

这篇文章的初稿就是用 Vim 写的。我特意花过一点时间学 Vim 基础操作,倒不是因为它多酷,而是编辑 Markdown 文件时手不需要离开键盘,比鼠标切来切去快一点。就快这么一点,日积月累也多出不少时间。

到了现在,写脚本已经成了一种习惯。遇到重复劳动,大脑自动开始想”这个事情能不能自动化”。有时候花在自动化上的时间,比手动做完还多——但那又怎样呢?过程是开心的,每次优化出更好的方案也有成就感。

毕竟写脚本本身,就是一件让人上瘾的事。

Footnotes

  1. 真的去数过,最多的时候有 400 多个文件,其中一半早就不记得是什么了。

种下你的想法

在花园里留下一条评论,和这篇文章一起生长。

COMMENTS