📎 配套资产 / Companion assets:本篇所有示例的可下载文件在仓库 配套资产/B18_批量脚本/——批量重命名 / Word 查找替换 / 批量转 PDF / 合并 Word 四个可跑案例,每个子目录都带中文 README 与 English README。 English: downloadable files for every example in this article live in 配套资产/B18_批量脚本/ — four runnable cases: batch rename / Word find-replace / batch PDF / merge Word, each with a bilingual README.

【自动化】AI 写脚本批量处理 Excel/Word

摘要:用 AI 写出 PowerShell 脚本,把几百个文件的重复活儿一键干完。

一、痛点引入

你大概率被这些活儿折磨过:

  • 月底要交 200 份 Excel 报表,文件名还是"销售报表_01.xlsx、销售报表_02.xlsx……",老板要求统一改成"2024销售_01.xlsx",你只能一个个右键重命名,改到眼晕;
  • 公司名从"XX有限公司"变成"XX集团有限公司",几十份 Word 合同里全要改,你打开每份文档,按 Ctrl + H 一个一个替换;
  • 要把 50 份 Word 周报合成一份发给领导,或者把 30 份 Excel / Word 统一转成 PDF 归档——全靠手动点"另存为",点到鼠标都快冒烟了。

这些活儿的共性特别清楚:规则一模一样、数量巨大、纯重复。人做不仅慢,还容易漏、容易错;而脚本最擅长"照着同一条规则重复干一百遍"。

问题在于:你不是程序员,让你从零写代码,门槛太高。这一篇就教你一个取巧的办法——让 Kimi/智谱清言(GLM)帮你写 PowerShell 脚本,你只管把"我想干嘛"说清楚,它把代码吐出来,你复制运行就行。

二、目标产出

读完并照做,你会得到:

  1. 搞懂两个新词:PowerShellCOM object(下面实战前先用大白话讲清);
  2. 一套"跟 ChatGPT 要脚本"的提示词模板,以后换任何批量需求都能套用;
  3. 四个真实可运行的 PowerShell 脚本:批量重命名、批量 Word 查找替换、批量转 PDF、批量合并 Word;
  4. 一份避坑清单,知道哪些地方最容易翻车、怎么救。

本篇是 L2(进阶)。不要求你会写代码,但希望你至少用过一次"命令提示符/终端",并且电脑上装了桌面版 Office(后面会解释为什么)。

三、案例实战

3.0 先搞懂两个词(不然代码看不懂)

  • PowerShell = Windows 自带的命令行工具,能批量指挥电脑干活。你可以把它理解成"升级版命令提示符",专门用来写脚本自动跑任务。Win10/Win11 自带,不用另外装。
  • COM object = Windows 里的一种"遥控接口"。PowerShell 通过它,能像人一样去"打开"你电脑上已经装好的 Word、Excel,然后模拟点击菜单。文章里你会看到 New-Object -ComObject Word.Application,意思就是"新建一个 Word 的遥控接口,准备遥控 Word 干活"。

3.1 准备工作(两步搞定)

第一步:确认装了桌面版 Office。 COM object 必须遥控"装在电脑上的 Office 桌面程序"才能用。网页版 Office(浏览器里那个)、手机 App 都不行。怎么看?打开"开始菜单",能找到"Word / Excel"桌面图标、能正常打开 .docx / .xlsx,就说明装了,OK。

第二步:打开 PowerShell ISE。 "PowerShell ISE"=PowerShell 自带的脚本编辑器,左边写代码、上面跑,对新手最友好。打开方法:点"开始菜单",直接搜 PowerShell ISE,点开即可。后面所有脚本都贴在它的脚本窗口里,按 F5 运行。

小提示:脚本里用到中文路径或文件名时,PowerShell ISE 默认用 UTF-8 存文件,一般没问题;如果你用记事本存 .ps1,记得另存时编码选"UTF-8",否则中文会乱码。

3.2 案例 A:用 AI 写脚本,批量重命名文件

⚠️ 动手前先备份:案例 A(重命名)和案例 B(查找替换)都会直接改写原文件。先把要处理的文件夹整体复制一份,在副本上跑通、抽查结果满意后,再处理正本。

你跟 ChatGPT 说什么(提示词):

"帮我写一段 PowerShell 脚本:把 C:\报表 文件夹里所有文件名中的'销售报表'替换成'2024销售',例如 销售报表_01.xlsx 变成 2024销售_01.xlsx。每个文件改名后打印一行提示。只要 PowerShell 自带命令,不要调用 Office。"

ChatGPT 给你的脚本(真实可运行):

powershell
# 批量重命名:把"销售报表"换成"2024销售" $folder = "C:\报表" Get-ChildItem -Path $folder -Filter "销售报表_*.xlsx" | ForEach-Object { # 用 -replace 把文件名里的旧词换成新词 $newName = $_.Name -replace "销售报表", "2024销售" Rename-Item -Path $_.FullName -NewName $newName Write-Host "已重命名:$($_.Name) -> $newName" } Write-Host "全部搞定!"

怎么跑: 把上面代码粘进 PowerShell ISE,把 $folder 改成你自己的文件夹,按 F5关键点: 这一步纯粹用 PowerShell 自带命令(Get-ChildItem 列文件、Rename-Item 改名),不碰 Office,所以即使没装 Office 也能跑。

3.3 案例 B:批量在 Word 里"查找→替换"

你跟 ChatGPT 说什么(提示词):

"写一段 PowerShell 脚本:用 COM object 打开 C:\合同 文件夹里所有 .docx,把全文'有限公司'替换成'集团有限公司',保存并关闭。处理完一个打印一行。脚本跑完要退出 Word 并释放 COM 对象。"

ChatGPT 给你的脚本(真实可运行):

powershell
# 批量 Word 查找替换:有限公司 -> 集团有限公司 $folder = "C:\合同" # 新建 Word 的遥控接口(COM object),后台运行不弹界面 $word = New-Object -ComObject Word.Application $word.Visible = $false $word.DisplayAlerts = $false # 关掉"是否保存"之类的弹窗 Get-ChildItem -Path $folder -Filter "*.docx" | ForEach-Object { $doc = $word.Documents.Open($_.FullName) $sel = $word.Selection $sel.Find.ClearFormatting() $sel.Find.Replacement.ClearFormatting() # Execute 的参数从左到右依次是: # 第1个=查找内容, 第7个=朝文档末尾方向搜(true), 第8个=Wrap(1=搜到头继续), 第10个=替换内容, 第11个=2(全部替换) [void]$sel.Find.Execute( [ref]"有限公司", [ref]$false, [ref]$false, [ref]$false, [ref]$false, [ref]$false, [ref]$true, [ref]1, [ref]$false, [ref]"集团有限公司", [ref]2) $doc.Save() [void]$doc.Close() [System.Runtime.InteropServices.Marshal]::ReleaseComObject($doc) | Out-Null # 释放当前文档的 COM 引用 Write-Host "已处理:$($_.Name)" } # 退出 Word 并释放 COM 对象(重要,见避坑指南第 2 条) [void]$word.Quit() [System.Runtime.InteropServices.Marshal]::ReleaseComObject($word) | Out-Null Remove-Variable word Write-Host "全部搞定!"

怎么跑: 粘进 PowerShell ISE,改 $folder,按 F5。运行期间你看不到 Word 窗口(因为 Visible = $false),它在后台悄悄干。 关键点: Find.Execute 的第 11 个参数 2 代表"全部替换"(Word 里叫 wdReplaceAll);第 8 个参数 1 代表搜索到文末后回到开头继续(wdFindContinue)。这两个数字是 Office 内部常量,记住即可。

3.4 案例 C:批量把 Word / Excel 转成 PDF

你跟 ChatGPT 说什么(提示词):

"写两段 PowerShell 脚本:第一段把 C:\文档 里所有 Word(.docx) 转成同名的 PDF;第二段把 C:\表格 里所有 Excel(.xlsx) 转成同名的 PDF。都用 COM object,后台运行,跑完退出并释放对象。"

ChatGPT 给你的脚本(真实可运行):

powershell
# ===== 第一部分:Word 批量转 PDF ===== $wordFolder = "C:\文档" $word = New-Object -ComObject Word.Application $word.Visible = $false $word.DisplayAlerts = $false # 关掉"是否保存"之类的弹窗 Get-ChildItem -Path $wordFolder -Filter "*.docx" | ForEach-Object { $doc = $word.Documents.Open($_.FullName) $pdf = $_.FullName -replace "\.docx$", ".pdf" # SaveAs 第2个参数 17 = wdFormatPDF(Word 自带导出 PDF 格式) [void]$doc.SaveAs([ref]$pdf, [ref]17) [void]$doc.Close() [System.Runtime.InteropServices.Marshal]::ReleaseComObject($doc) | Out-Null # 释放当前文档的 COM 引用 Write-Host "已转 PDF:$pdf" } [void]$word.Quit() [System.Runtime.InteropServices.Marshal]::ReleaseComObject($word) | Out-Null Remove-Variable word # ===== 第二部分:Excel 批量转 PDF ===== $excelFolder = "C:\表格" $excel = New-Object -ComObject Excel.Application $excel.Visible = $false $excel.DisplayAlerts = $false # 关掉"是否保存"之类的弹窗 Get-ChildItem -Path $excelFolder -Filter "*.xlsx" | ForEach-Object { $wb = $excel.Workbooks.Open($_.FullName) $pdf = $_.FullName -replace "\.xlsx$", ".pdf" # ExportAsFixedFormat 第1个参数 0 = xlTypePDF(导出为 PDF) [void]$wb.ExportAsFixedFormat(0, $pdf) [void]$wb.Close() Write-Host "已转 PDF:$pdf" } [void]$excel.Quit() [System.Runtime.InteropServices.Marshal]::ReleaseComObject($excel) | Out-Null Remove-Variable excel Write-Host "全部搞定!"

怎么跑: 分别改 $wordFolder$excelFolder 为你自己的目录,按 F5关键点: Word 用 SaveAs(路径, 17),Excel 用 ExportAsFixedFormat(0, 路径)——两者转 PDF 的命令不一样,别混。数字 170 都是 Office 内部格式常量。

健壮性提示:想让某个文件转 PDF 失败也不影响其他文件,可把每段 Get-ChildItem ... | ForEach-Object { ... } 包进 try/catch(详见 B19《模块化脚本与错误处理》),坏的那份记一笔、好的照常转。

3.5 案例 D:把几十份 Word 周报合并成一份

你跟 ChatGPT 说什么(提示词):

"写一段 PowerShell 脚本:用 COM object 把 C:\周报 文件夹里所有 .docx 按文件名顺序合并成一个新文档 C:\周报_合并\合并周报.docx(输出到另一个目录),每份之间插一个分页符。后台运行,跑完退出并释放对象。"

ChatGPT 给你的脚本(真实可运行):

powershell
# 批量合并 Word:把多份文档合成一份,每份之间分页 $folder = "C:\周报" # 输出到另一个目录,避免二次运行时把上次的"合并周报.docx"又嵌进来 $out = "C:\周报_合并\合并周报.docx" # 先确保输出目录存在(Split-Path 取文件名之前的路径) New-Item -ItemType Directory -Force -Path (Split-Path $out) | Out-Null $word = New-Object -ComObject Word.Application $word.Visible = $false $word.DisplayAlerts = $false # 关掉"是否保存"之类的弹窗 $merged = $word.Documents.Add() # 新建一个空白文档当"容器" $sel = $word.Selection # Sort-Object Name 按文件名字典序排列(建议源文件用 01、02… 等长编号,否则 10 会排在 2 前面) Get-ChildItem -Path $folder -Filter "*.docx" | Sort-Object Name | ForEach-Object { # InsertFile 把当前文档内容插到光标处 [void]$sel.InsertFile($_.FullName) # InsertBreak 第 1 个参数 7 = wdPageBreak(分页符),让下一份从新页开始 # 注意:Word 枚举里 7=wdPageBreak、2=wdSectionBreakNextPage;写 1 不在枚举内会出错 [void]$sel.InsertBreak(7) Write-Host "已合并:$($_.Name)" } [void]$merged.SaveAs([ref]$out) [void]$merged.Close() [void]$word.Quit() [System.Runtime.InteropServices.Marshal]::ReleaseComObject($word) | Out-Null Remove-Variable word Write-Host "合并完成,文件在:$out"

怎么跑:$folder(源周报目录),按 F5。合并结果输出到 C:\周报_合并\合并周报.docx(和源目录分开,二次运行不会把上次结果再嵌进来)。 关键点: Sort-Object Name 这一步很重要——它按文件名字典序排列;建议源文件用 0102… 等长编号,否则 10 会排在 2 前面,周报顺序错乱领导会头疼。

四、原理小结

说到底,PowerShell 本身并不会"读懂"Word 或 Excel,它只是通过 COM object 这个遥控接口,在你电脑后台悄悄启动一个看不见的 Office 程序,然后模拟你平时"打开文件→点查找替换→点保存"的一系列鼠标操作。AI(比如 Kimi/GLM)在这里的价值,是把你那句大白话"帮我把几十份合同里的公司名都改了",翻译成上面那段带 [ref]、带数字常量的脚本——你不用背这些参数,记住"让 AI 写、自己复制跑"这个套路就够了。

五、避坑指南

  1. 必须装桌面版 Office。 COM object 只能遥控装在你电脑上的 Office 桌面程序(Word/Excel 的 .exe)。网页版 Office、Office 365 云盘里的文件、手机 App 都接不上,脚本会报"找不到 COM 对象"之类的错。
  2. 脚本跑完一定要 Quit() 并释放 COM 对象。 上面每个案例最后都写了 $word.Quit()ReleaseComObject。如果你漏了这步,后台的 Word/Excel 进程关不掉,越积越多会拖慢电脑,任务管理器里能看到一堆 WINWORD.EXE / EXCEL.EXE。养成习惯:开几个就关几个。
  3. 路径里有中文或空格,一定加引号。 比如 "C:\我的文档\合同" 必须带双引号,否则 PowerShell 会把空格当成命令分隔符,直接报错。路径用反斜杠 \ 或正斜杠 / 都行,但同一段脚本里保持一致。
  4. 第一次运行 .ps1 可能被 Windows 拦下。 如果双击或运行时提示"无法加载文件,因为在此系统上禁止运行脚本",先开 PowerShell 跑一句:Set-ExecutionPolicy RemoteSigned -Scope CurrentUser(意思:本机写的脚本能跑,从网上下载的脚本要有签名)。为什么加 -Scope CurrentUser:只改你自己这个用户的策略、不需要管理员权限、也不动公司电脑的全局设置——这是最小改动;B17 黑名单里提醒过"别乱改执行策略",指的就是别图省事上 Bypass/Unrestricted 这种全放开档位。改一次就行。
  5. 转 PDF 依赖 Office 自带导出功能。 SaveAs(…, 17)ExportAsFixedFormat(0, …) 用的是 Word 2010 / Excel 2010 以后内置的 PDF 导出。如果你用的是更老的 Office 2007(且没装 PDF 插件),转 PDF 会失败,升级 Office 即可。

六、进阶延展

走到这儿,你已经能用 AI 写出 PowerShell 脚本,把重复的 Office 杂活一键干完——这已经解决了 80% 的"批量痛苦"。

  • 想先补基础? 如果觉得"命令行 / 脚本"还是有点虚,建议回看 L1 的 B17《第一条命令》,它从最傻瓜的第一步带你建立"让电脑替我跑命令"的手感,再来读本篇会轻松很多。
  • 想再上一层? 现在的脚本还得你手动按 F5 跑。下一步可以学 L3 的"任务计划程序(Task Scheduler)定时自动跑脚本"——把写好的 .ps1 挂上定时器,比如每天凌晨 2 点自动把当天的报表转成 PDF,真正"睡醒就有结果"。
  • 嫌 PowerShell 太硬核? 也可以拐去学 macro(宏) 路线:Excel / Word 里自带的"录制宏"能把你的鼠标操作录成代码,门槛比 PowerShell 更低,适合只在单个文件里做重复操作的人。