# ⚙️ B18｜AI 写脚本批量处理 Excel / Word — 配套资产

> **系列**：AI 办公实战：从小白到达人
> **文章号**：B18（Track 3 自动化 / Level 2 进阶）
> **配套中文标题**：AI 写脚本批量处理 Excel / Word
> **配套英文标题**：Script Batch Office Processing

---

## 一、这是给谁的？解决什么问题？

写给**每月都被 200 份 Excel / Word 重复活儿折磨**的朋友：批量重命名、批量替换、批量转 PDF、批量合并——每一件都是"机械重复、量大、规则固定"。

主教程教你**怎么让 ChatGPT / 通义帮你写脚本**；本目录提供 **4 个真实可运行的 PowerShell 脚本**，覆盖最常见的 4 个批量场景，**复制即用**：

| 案例 | 干什么 | 用到的关键技术 |
|------|--------|----------------|
| A | 批量重命名文件 | `Get-ChildItem` + `Rename-Item`（**不依赖 Office**） |
| B | Word 批量查找替换 | Word COM + `Find.Execute`（含 5 个核心参数） |
| C | 批量转 PDF | Word COM `SaveAs(_, 17)` + Excel COM `ExportAsFixedFormat(0, _)` |
| D | 合并多份 Word | Word COM `InsertFile` + `InsertBreak`（输出到独立目录防二次嵌入） |

---

## 二、使用方法（4 步跑通任一案例）

### 第一步：环境准备（一次性）

1. **桌面版 Office**：必须装在电脑上（Word / Excel 的 `.exe`），网页版不行；
2. **PowerShell ISE 或 VS Code**：开始菜单搜"PowerShell ISE"，点开；
3. **放开执行策略**（第一次需要）：管理员 PowerShell 跑
   ```powershell
   Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
   ```
   之后双击 `.ps1` 或命令行运行就不再被拦。

### 第二步：准备测试文件

打开本目录的 **`示例文件清单.txt`**（同目录有英文版 `SampleFiles_en.txt`），按里面建议建一些测试文件到 `C:\测试\…` 子目录下。

### 第三步：改路径参数

每个 `.ps1` 的第 1 段都是 `param(...)`，把里面的文件夹路径改成你自己的（如 `-Folder "C:\测试\合同"`）。PowerShell ISE 里直接编辑最方便。

### 第四步：按 F5 跑（或命令行跑）

```powershell
# 在脚本所在目录的 PowerShell 里：
.\案例A_批量重命名_zh.ps1 -Folder "C:\测试\重命名前" -OldPart "销售报表" -NewPart "2024销售"
# ↑ 默认预览；加 -Apply 才真改名
```

每个脚本跑完都会打印 `[完成] 文件名` 或 `[失败] 原因`，看打印就知道结果。

---

## 三、文件清单

| 文件名 | 类型 | 案例 | 安全等级 |
|--------|------|------|----------|
| `B18_批量脚本_中文README.md` | Markdown | 本文件 | — |
| `B18_BatchScript_EnglishREADME.md` | Markdown | 英文版 README | — |
| `案例A_批量重命名_zh.ps1` | PowerShell | A：重命名 | 🟡 黄（默认预览） |
| `案例A_批量重命名_en.ps1` | PowerShell | A：重命名（英文版） | 🟡 黄 |
| `案例B_Word查找替换_zh.ps1` | PowerShell | B：Word 替换 | 🟡 黄（直接改文档） |
| `案例B_Word查找替换_en.ps1` | PowerShell | B：英文版 | 🟡 黄 |
| `案例C_批量转PDF_zh.ps1` | PowerShell | C：转 PDF | 🟡 黄（生成新 PDF） |
| `案例C_批量转PDF_en.ps1` | PowerShell | C：英文版 | 🟡 黄 |
| `案例D_合并Word_zh.ps1` | PowerShell | D：合并 Word | 🟡 黄（生成合并文件） |
| `案例D_合并Word_en.ps1` | PowerShell | D：英文版 | 🟡 黄 |
| `示例文件清单.txt` | 文本 | 中文测试文件建议 | — |
| `SampleFiles_en.txt` | 文本 | 英文版测试文件建议 | — |

---

## 四、实战代码（关键片段 + 解读）

### 案例 A —— 批量重命名（核心）

```powershell
$files = Get-ChildItem -Path $Folder -Filter $Filter -File    # 1 列出所有匹配文件
foreach ($f in $files) {
    $newName = $f.Name -replace "销售报表", "2024销售"          # 2 算出新文件名
    Rename-Item -Path $f.FullName -NewName $newName            # 3 改名
    Write-Host "[完成] $($f.Name)  ->  $newName"
}
```

**3 步走**：列文件 → 算新名 → 改名。**完全用 PowerShell 自带命令**，不依赖 Office，所以即使电脑没装 Word/Excel 也能跑。

### 案例 B —— Find.Execute 的 5 个核心参数

```powershell
[void]$sel.Find.Execute(
    [ref]"有限公司",     # 1 FindText       要查的字符串
    [ref]$false,        # 2 MatchCase      大小写敏感否
    [ref]$false,        # 3 MatchWildcards 通配符
    [ref]$false,        # 4 MatchSoundsLike 同音字
    [ref]$false,        # 5 MatchAllWordForms 单词所有形式
    [ref]$true,         # 6 Forward        向后搜
    [ref]1,             # 7 Wrap           1 = 搜到末尾回到开头继续
    [ref]$false,        # 8 Format         是否按格式搜
    [ref]"集团有限公司", # 9 ReplaceWith    替换为
    [ref]2              # 10 Replace       2 = 全部替换（wdReplaceAll）
)
```

完整 `.Execute()` 接受 15 个参数，常用就这 10 个；**数字 `2` = 全部替换，`1` = 继续搜索**，这两个最常考。

### 案例 C —— 转 PDF 的两条路径

```powershell
# Word：SaveAs(路径, 17)，17 = wdFormatPDF
[void]$doc.SaveAs([ref]$pdf, [ref]17)

# Excel：ExportAsFixedFormat(0, 路径)，0 = xlTypePDF
[void]$wb.ExportAsFixedFormat(0, $pdf)
```

**别混**：Word 用 `SaveAs(_, 17)`，Excel 用 `ExportAsFixedFormat(0, _)`；常量值都是 Office 内部硬编码的。

### 案例 D —— 合并 Word 的"输出目录防坑"

```powershell
# 输出文件必须在源目录之外 —— 否则二次运行时会把上次结果嵌进来
if ($OutputFile.StartsWith($SourceFolder.TrimEnd('\') + ...)) {
    Write-Host "[错误] 输出文件不能放在源文件夹里" -ForegroundColor Red
    exit 1
}
```

**这一行自检是案例 D 的精华**。如果不挡这一下，第二次跑会把上次生成的"汇总.docx"再次合并进新汇总里，体积指数级膨胀。

---

## 五、常见问题 / 避坑指南

1. **必须装桌面版 Office。** COM object 只能遥控装在电脑上的 Office 桌面程序（`WINWORD.exe` / `EXCEL.exe`）。网页版 Office、Office 365 云盘、手机 App 都不行。

2. **脚本跑完一定要 `Quit()` 并 `ReleaseComObject`。** 上面每个案例 `finally` 块里都写了这两步。如果你漏了，后台的 Word/Excel 进程关不掉，越积越多会拖慢电脑，任务管理器里能看到一堆 `WINWORD.EXE`。

3. **路径里有中文或空格，一定加引号。** 比如 `"C:\我的文档\合同"` 必须带双引号，否则 PowerShell 会把空格当成命令分隔符直接报错。

4. **第一次运行 `.ps1` 被 Windows 拦？** 跑一句 `Set-ExecutionPolicy RemoteSigned -Scope CurrentUser` 即可；只允许跑本机写的脚本（远程下载的脚本需要数字签名才放行）。

5. **转 PDF 失败 / `SaveAs(17)` 报错？** Office 2010 之前没有内置 PDF 导出，需要装"Microsoft Save as PDF"插件；升级 Office 即可解决。

---

## 六、下一步

跑通 4 个案例后，你已经能写"几百份 Word / Excel 的一键操作"脚本了。下一步：

- **想加错误处理、看运行日志？** 看 **B19《模块化脚本与错误处理》**：用 `try/catch/finally` 让某个文件出错不影响其他文件，把每一步写进日志。
- **想让脚本定时自动跑？** 看 **B20《自动化流水线》**：把今天的 `.ps1` 挂上 Windows 任务计划程序，每天凌晨自动转 PDF，你睡醒直接看结果。
- **想写自己的脚本？** 看 **A3 提示词入门**：用"角色 + 任务 + 约束 + 输出格式"的模板，让 AI 给你写出更稳的脚本。

---

> 📌 **快速核查清单**（跑之前再确认一次）：
> - [ ] 装了桌面版 Office（不是网页版）；
> - [ ] 放开执行策略 `Set-ExecutionPolicy RemoteSigned -Scope CurrentUser`；
> - [ ] 改了 `.ps1` 的 `param` 路径为你自己的目录；
> - [ ] 案例 A 默认预览，不加 `-Apply` 不会真改名；
> - [ ] 案例 D 的输出文件路径在源目录之外。