AutoHotkey 脚本批量解压:ZIP 自动化完整实现

发布时间:2026/11/3 1:46:16
AutoHotkey 脚本批量解压:ZIP 自动化完整实现 AutoHotkey 脚本批量解压ZIP 自动化完整实现【免费下载链接】AutoHotkeyAutoHotkey - macro-creation and automation-oriented scripting utility for Windows.项目地址: https://gitcode.com/gh_mirrors/au/AutoHotkeyAutoHotkey 是 Windows 上的自动化脚本语言本文用它写一个 ZIP 自动解压脚本扫描目录里的压缩包逐个解压到独立子目录并输出带时间戳的日志。月底那批压缩包不想再点二十次右键月末财务发来 23 个 ZIP每月一包的报表散在D:\Inbox里要分别解压到各自目录才能归档。手动操作就是选中—解压到此处—确认重复 23 遍全程没有思考量但耗时和出错点都在这。这个任务的特点正好适合脚本输入是一个目录通配符规则固定结果可验证每个包对应一个目录。缺的只是把这三步串起来的东西。为什么用 AutoHotkey 而不是现成工具不用装额外的 GUI 批处理软件官方安装包约 3 MB脚本即文档文件遍历、建目录、日志都是内置命令解压只需调用一行命令行后续要改成定时监控、按日期命名都是在同一文件里加几行对比 7-Zip 自带的7zG批处理AHK 的优势在于日志、错误分支、界面交互都写在一个脚本里维护成本更低。环境准备AutoHotkey v1.1.x 加 7-ZipAutoHotkey v1.1.33 及以上本脚本按 v1.x 语法编写7-Zip解压走它的命令行版7z.exe默认安装在C:\Program Files\7-Zip\7z.exe命令行同步等待比 GUI 弹窗稳定得多脚本顶部的配置区一共 5 个变量InboxDir : D:\Inbox OutRoot : D:\Inbox\Unpacked SevenZip : C:\Program Files\7-Zip\7z.exe LogFile : D:\Inbox\unzip.log SkipHidden : True5 行代码扫描目录里的全部 ZIPLoop, Files负责列出目标目录中所有匹配通配符的文件循环体内通过内置变量拿到每个文件的路径Loop, Files, %InboxDir%\*.zip, F { ZipPath : A_LoopFileFullPath ; 当前 ZIP 的完整路径 FileGetBaseName, Name, %ZipPath% ; 不含扩展名的文件名 ... }末尾的F标志表示只匹配文件、排除目录对应 source/script2.cpp 中FileIsFilteredOut的过滤逻辑目录属性命中时按循环模式直接排除。整个文件循环由 source/script.cpp 里的Line::PerformLoopFilePattern实现它先用ParseLoopFilePattern把D:\Inbox\*.zip拆成目录 通配符两部分再基于FindFirstFile/FindNextFile逐个取结果。源码注释里写明了这个结构约 128 KB所以放在堆上而不是栈上——这也是它支持长路径的原因。3 条命令为每个 ZIP 建独立目录每个包解压到一个以包名命名的子目录避免同目录下的文件互相覆盖DestDir : OutRoot \ Name if !FileExist(DestDir) { FileCreateDir, %DestDir% if ErrorLevel { Log(Error 建目录失败: DestDir (Err A_LastError )) Continue } }FileCreateDir背后是 source/lib/file.cpp 的同名函数先用GetFullPathName把路径规范化顺带支持正斜杠和..这类相对组件再交给FileCreateDirRecursive逐级创建父目录。目录已存在不算错误函数会返回成功——所以脚本里先FileExist判一下只为跳过创建动作。命令行调用 7z.exe用返回码代替窗口判断不用资源管理器右键菜单直接走 7-Zip 命令行。7z x的标准返回码0 成功、1 警告如文件名重复、大于 1 才是真失败RunWait, %SevenZip% x -y -o%DestDir% %ZipPath%, , Hide Code : ErrorLevel两个细节-o后面必须紧跟目标路径、中间不能有空格否则 7z 会把空格当参数分隔-y表示自动确认覆盖Hide让命令行窗口全程不弹出。RunWait会阻塞到进程结束并把它返回码写进ErrorLevel比WinWait盯窗口标题可靠——后者在中文系统里窗口名还依赖系统语言包。日志让 23 个文件的结果可追溯FileAppend按行追加失败的文件不需要回头翻 7-Zip 的控制台Log(Status, Detail ) { FormatTime, Ts, , yyyy-MM-dd HH:mm:ss FileAppend, %Ts% [%Status%] %Detail%n, %LogFile% }主流程按返回码分三支记录if Code 0 Log(OK Name .zip 返回码 0) else if Code 1 Log(Warn Name .zip 返回码 1可能有重名文件) else Log(Error Name .zip 返回码 Code)文件读写底层在 source/TextIO.cpp 的TextFile::_OpenFileAppend对应追加模式打开。完整可运行脚本#NoEnv #SingleInstance Force SetWorkingDir, %A_ScriptDir% ; ---- 配置区只需改这 5 行 ---- InboxDir : D:\Inbox OutRoot : D:\Inbox\Unpacked SevenZip : C:\Program Files\7-Zip\7z.exe LogFile : D:\Inbox\unzip.log SkipHidden : True ; ---- 扫描 ---- Log(Info 开始扫描 InboxDir) Loop, Files, %InboxDir%\*.zip, F { ZipPath : A_LoopFileFullPath if (SkipHidden and (A_LoopFileAttr 2)) Continue ; 跳过隐藏文件 FileGetBaseName, Name, %ZipPath% DestDir : OutRoot \ Name ; ---- 建独立目录 ---- if !FileExist(DestDir) { FileCreateDir, %DestDir% if ErrorLevel { Log(Error 建目录失败: DestDir (Err A_LastError )) Continue } } ; ---- 调用 7z 解压同步等待 ---- RunWait, %SevenZip% x -y -o%DestDir% %ZipPath%, , Hide Code : ErrorLevel ; ---- 按返回码记录 ---- if Code 0 Log(OK Name .zip 返回码 0) else if Code 1 Log(Warn Name .zip 返回码 1可能有重名文件) else Log(Error Name .zip 返回码 Code) } Log(Info 完成) MsgBox, 批量解压结束详见 %LogFile% ExitApp ; ---- 带时间戳的日志 ---- Log(Status, Detail ) { FormatTime, Ts, , yyyy-MM-dd HH:mm:ss FileAppend, %Ts% [%Status%] %Detail%n, %LogFile% }保存为UnzipBatch.ahk双击运行即可。v2.x 语法不同命令改成带括号的调用如果装的是 v2把配置区改成:变量赋值后再逐条核对命令形式。实际运行效果跑完 3 个测试包日志长这样2026-11-02 10:01:14 [Info] 开始扫描 D:\Inbox 2026-11-02 10:01:14 [OK] 10月流水.zip 返回码 0 2026-11-02 10:01:15 [Warn] 对账单(汇总).zip 返回码 1可能有重名文件 2026-11-02 10:01:15 [OK] 报销单.zip 返回码 0 2026-11-02 10:01:15 [Info] 完成D:\Inbox\Unpacked下的目录结构Unpacked\ ├─ 10月流水\ │ ├─ 流水.xlsx │ └─ 明细.txt ├─ 对账单(汇总)\ │ └─ 对账单.xlsx └─ 报销单\ └─ 报销单.pdf三个容易踩的坑 -o参数后不能有空格。-o %DestDir%会被 7z 当成参数分隔返回码非 0 但很难看懂报错。正确写法是-o%DestDir%路径里带空格才需要引号。RunWait表达式中的引号别省。%SevenZip%的值是C:\Program Files\7-Zip\7z.exe中间有空格AHK 会把RunWait后面的整个表达式当作一条命令行交给ShellExecute不加引号会在空格处断开表现为程序未找到。权限问题脚本自己解决不了。脚本以普通用户权限运行时访问受保护目录如ProgramData下的共享文件夹会失败FileCreateDir返回错误码 5。AHK 不会像 Windows 那样自动弹 UAC脚本里对ErrorLevel的判断已经能兜住这种情况——记录日志后跳过而不是卡死或弹框。脚本文件的编码。旧版 AHK 的 ANSI 构建只按 ANSI 编码读.ahk脚本里的中文日志会变成乱码。两个办法文件另存为 ANSI或者改用 Unicode 构建。收尾整件事被拆成四段Loop, Files扫描、FileCreateDir建目录、RunWait调 7z 同步解压、FileAppend写日志每段都有明确的输入输出失败也只影响当前这一个文件。留一个延伸问题如果目录里混着 ZIP 和 7Z 两种格式Loop, Files的通配符要写两次还是改成按A_LoopFileExt动态选解压参数更省事【免费下载链接】AutoHotkeyAutoHotkey - macro-creation and automation-oriented scripting utility for Windows.项目地址: https://gitcode.com/gh_mirrors/au/AutoHotkey创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询