1 / 22
📚

Part 04 Unit 01

批次轉換多個檔案

一次轉換大量檔案

告別手動重複操作

使用鍵盤 ← → 或點擊按鈕翻頁

2 / 22

學習目標

完成本單元後,你將學會:

  • 理解為何需要批次轉換
  • 使用 PowerShell 批次處理檔案
  • 撰寫簡單的批次轉換指令
  • 處理不同資料夾的檔案

💡 從手動一個一個轉,進化到一次轉完所有檔案!

3 / 22

為什麼需要批次轉換?

😰 手動轉換

  • 一個檔案一個指令
  • 100 個檔案 = 100 次操作
  • 容易出錯遺漏
  • 耗時費力

🚀 批次轉換

  • 一個指令處理全部
  • 100 個檔案 = 1 次操作
  • 自動化不出錯
  • 省時省力
4 / 22

實際情境

假設你有這樣的資料夾:

📁 我的筆記/
├── 📄 會議記錄01.md
├── 📄 會議記錄02.md
├── 📄 會議記錄03.md
├── 📄 專案報告.md
├── 📄 週報0101.md
├── 📄 週報0108.md
└── 📄 學習筆記.md

想要把所有 .md 檔案都轉成 .docx 該怎麼做?

5 / 22

步驟 1:準備練習檔案

在 Antigravity 中建立練習資料夾

開啟終端機 Ctrl + `

# 建立練習資料夾 mkdir D:\練習批次轉換 # 進入資料夾 cd D:\練習批次轉換

💡 使用專門的資料夾練習,避免影響其他檔案

6 / 22

步驟 2:建立測試檔案

使用 PowerShell 快速建立多個測試檔案

# 建立 5 個測試 Markdown 檔案 1..5 | ForEach-Object { "# 測試文件 $_`n這是第 $_ 個測試檔案。" | Out-File -FilePath "test$_.md" -Encoding UTF8 }

✅ 這會建立 test1.md、test2.md ... test5.md

7 / 22

步驟 3:確認檔案已建立

列出資料夾中的檔案

# 列出所有 .md 檔案 Get-ChildItem *.md

你應該會看到:

Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 2025/01/01 42 test1.md -a---- 2025/01/01 43 test2.md -a---- 2025/01/01 43 test3.md -a---- 2025/01/01 43 test4.md -a---- 2025/01/01 43 test5.md
8 / 22

批次轉換的核心概念

迴圈 + Pandoc = 批次轉換

對每一個檔案,執行一次 Pandoc 指令

PowerShell 迴圈結構:

ForEach-Object - 對每個物件執行動作

# 虛擬碼概念 取得所有 .md 檔案 | 對每個檔案 { pandoc 這個檔案 轉成 .docx }
9 / 22

步驟 4:執行批次轉換

關鍵指令!請記住這個:

Get-ChildItem *.md | ForEach-Object { pandoc $_.Name -o ($_.BaseName + ".docx") }

指令解析:

  • Get-ChildItem *.md - 取得所有 .md 檔案
  • | - 管道,傳遞給下一個指令
  • ForEach-Object - 對每個檔案執行
  • $_.Name - 當前檔案名稱
  • $_.BaseName - 不含副檔名的名稱
10 / 22

步驟 5:確認轉換結果

列出所有 .docx 檔案

Get-ChildItem *.docx

你應該會看到:

Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 2025/01/01 4521 test1.docx -a---- 2025/01/01 4522 test2.docx -a---- 2025/01/01 4523 test3.docx -a---- 2025/01/01 4524 test4.docx -a---- 2025/01/01 4525 test5.docx

🎉 5 個檔案一次全部轉換完成!

11 / 22

變化:轉換成其他格式

轉成 HTML

Get-ChildItem *.md | ForEach-Object { pandoc $_.Name -o ($_.BaseName + ".html") --standalone }

轉成 PDF(需安裝 LaTeX)

Get-ChildItem *.md | ForEach-Object { pandoc $_.Name -o ($_.BaseName + ".pdf") }
12 / 22

進階:篩選特定檔案

只轉換名稱含有「會議」的檔案

Get-ChildItem *.md | Where-Object { $_.Name -like "*會議*" } | ForEach-Object { pandoc $_.Name -o ($_.BaseName + ".docx") }

只轉換最近 7 天修改的檔案

Get-ChildItem *.md | Where-Object { $_.LastWriteTime -gt (Get-Date).AddDays(-7) } | ForEach-Object { pandoc $_.Name -o ($_.BaseName + ".docx") }
13 / 22

進階:輸出到指定資料夾

建立輸出資料夾並轉換

# 建立輸出資料夾 mkdir output # 轉換並輸出到 output 資料夾 Get-ChildItem *.md | ForEach-Object { pandoc $_.Name -o ("output\" + $_.BaseName + ".docx") }
📁 練習批次轉換/
├── 📄 test1.md
├── 📄 test2.md
└── 📁 output/
    ├── 📄 test1.docx
    └── 📄 test2.docx
14 / 22

進階:處理子資料夾內的檔案

使用 -Recurse 參數遞迴搜尋

# 轉換所有子資料夾中的 .md 檔案 Get-ChildItem *.md -Recurse | ForEach-Object { $outputPath = $_.DirectoryName + "\" + $_.BaseName + ".docx" pandoc $_.FullName -o $outputPath }

⚠️ -Recurse 會搜尋所有子資料夾

使用時請確認範圍,避免意外轉換不需要的檔案

15 / 22

進階:加入進度顯示

讓轉換過程更清楚

$files = Get-ChildItem *.md $total = $files.Count $current = 0 $files | ForEach-Object { $current++ Write-Host "[$current/$total] 轉換: $($_.Name)" pandoc $_.Name -o ($_.BaseName + ".docx") } Write-Host "✅ 轉換完成!共 $total 個檔案"
[1/5] 轉換: test1.md [2/5] 轉換: test2.md [3/5] 轉換: test3.md [4/5] 轉換: test4.md [5/5] 轉換: test5.md ✅ 轉換完成!共 5 個檔案
16 / 22

常見問題排解

問題 原因 解決方法
沒有任何輸出 資料夾內沒有 .md 檔案 確認在正確的資料夾
檔名有空格報錯 路徑需要引號 使用雙引號包住路徑
中文檔名亂碼 編碼問題 確保 UTF-8 編碼
部分檔案失敗 檔案內容有問題 單獨檢查該檔案
17 / 22

處理有空格的檔名

使用 FullName 和引號處理

Get-ChildItem *.md | ForEach-Object { $input = "`"$($_.FullName)`"" $output = "`"$($_.DirectoryName)\$($_.BaseName).docx`"" pandoc $input -o $output }

💡 使用 FullName 取得完整路徑,再用引號包住

18 / 22

完整實用腳本

# 批次轉換腳本 - 從 Markdown 到 Word # 使用方式:在含有 .md 檔案的資料夾執行 $ErrorActionPreference = "Continue" $files = Get-ChildItem -Filter "*.md" if ($files.Count -eq 0) { Write-Host "❌ 找不到任何 .md 檔案" -ForegroundColor Red exit } Write-Host "🔍 找到 $($files.Count) 個 Markdown 檔案" -ForegroundColor Cyan $success = 0 $failed = 0 foreach ($file in $files) { Write-Host "📄 轉換: $($file.Name)" -NoNewline try { pandoc $file.Name -o ($file.BaseName + ".docx") Write-Host " ✅" -ForegroundColor Green $success++ } catch { Write-Host " ❌" -ForegroundColor Red $failed++ } } Write-Host "`n📊 完成!成功: $success, 失敗: $failed"
19 / 22

快速參考:一行指令

最常用的批次轉換指令

用途 指令
MD → DOCX gci *.md | % { pandoc $_.Name -o ($_.BaseName + ".docx") }
MD → HTML gci *.md | % { pandoc $_.Name -o ($_.BaseName + ".html") }
DOCX → MD gci *.docx | % { pandoc $_.Name -o ($_.BaseName + ".md") }

💡 gciGet-ChildItem 的縮寫

💡 %ForEach-Object 的縮寫

20 / 22

動手練習

練習任務

  1. 建立資料夾 D:\批次練習
  2. 在資料夾內建立 3 個 .md 測試檔案
  3. 使用批次指令將所有 .md 轉成 .docx
  4. 確認 3 個 .docx 檔案都已建立

預期結果

資料夾內應該有 3 個 .md 和 3 個 .docx 檔案

21 / 22

練習答案

🔒 輸入密碼查看答案

# 1. 建立資料夾 mkdir D:\批次練習 cd D:\批次練習 # 2. 建立測試檔案 1..3 | % { "# 測試 $_" | Out-File "file$_.md" -Encoding UTF8 } # 3. 批次轉換 gci *.md | % { pandoc $_.Name -o ($_.BaseName + ".docx") } # 4. 確認結果 gci
22 / 22

本單元總結

你學會了:

  • 使用 Get-ChildItem 取得檔案清單
  • 使用 ForEach-Object 迴圈處理
  • 批次轉換多個 Markdown 檔案
  • 篩選特定檔案進行轉換

核心指令

gci *.md | % { pandoc $_.Name -o ($_.BaseName + ".docx") }

下一單元:建立自動化腳本 📜