嘿,朋友!你是不是也经历过这种崩溃时刻:手头有一堆 PDF、Word 或者图片文件需要打印,结果只能一个一个打开,右键点击“打印”,再关掉,再打开下一个……如果是几十上百个文件,那简直是把人生浪费在重复劳动上。
别慌,今天我不给你整那些虚头巴脑的理论,咱们直接上干货。我就用我这么多年折腾电脑、写脚本的经验告诉你,怎么用 Windows 自带的 批处理(Batch) 命令,一键搞定所有文件的打印任务。整个过程就像点外卖一样简单,而且完全免费,不需要安装任何第三方软件。
为什么你会喜欢这个方法?
首先,我们要搞清楚一个观念:批处理不是黑客代码,它是你电脑的“自动化小助手”。
很多小白听到“命令行”、“脚本”就觉得高深莫测,其实批处理文件(.bat)本质上就是一堆你平时在命令提示符里敲的命令,保存成了一个文本文件,双击就能执行。
用批处理批量打印的优势很明显:
- 彻底解放双手:设置好一次,以后同类任务一键运行。
- 零成本:不用买软件,Windows 自带。
- 可控性强:你可以选择默认打印机,甚至指定具体的打印机。
- 逻辑清晰:即使以后你想修改,改个文件名或者路径就行。
第一步:理解核心命令 —— print
在 Windows 世界里,有一个被严重低估的命令,叫做 print。
注意,这不是用来打印“打印”这个动作的,它是专门用来向默认打印机发送文件的。它的语法非常简单:
print [驱动选项] filename
最常见的用法是直接跟文件名。比如你要打印一个叫 报告.docx 的文件,在命令行里输入:
print 报告.docx
然后回车,文件就会乖乖地发到打印队列里,等待打印机处理。
但是! 这里有个大坑。如果你直接写 print *.pdf,它可能会报错或者只打印第一个文件。这是因为 print 命令对路径和通配符的支持比较“古老”和“挑剔”。所以,我们需要配合 for 循环来使用,这才是批量打印的精髓。
第二步:编写你的第一个批量打印脚本
咱们先从最简单的场景开始:打印当前文件夹下所有的 PDF 文件。
1. 创建脚本文件
在你的桌面上,新建一个文本文档(.txt),打开它。
2. 写入核心代码
请复制以下代码到你的记事本里:
@echo off
chcp 65001 >nul
echo ========================================
echo 正在开始批量打印 PDF 文件...
echo 目标文件夹: 当前目录
echo ========================================
:: 设置要打印的文件类型,这里以 PDF 为例
set "FileType=*.pdf"
:: 进入当前目录
cd /d %~dp0
:: 检查是否有匹配的文件
set "count=0"
for %%f in (%FileType%) do (
echo 正在处理: %%~nxf
print /p "%%f"
set /a count+=1
)
echo ========================================
echo 完成!共处理 %count% 个文件。
echo ========================================
pause
3. 保存并运行
- 点击“文件” -> “另存为”。
- 文件名改成
批量打印PDF.bat(注意后缀必须是.bat,不是.txt)。 - 编码选择 UTF-8(这样文件名里的中文才不会乱码)。
- 保存后,把这个
.bat文件放到你有很多 PDF 的文件夹里,双击运行。
代码原理解析(给小朋友讲的版本):
想象你有一个机器人助手:
@echo off:告诉机器人“干活的时候别啰嗦,别把每一步都念出来”,这样屏幕会干净很多。chcp 65001:这是为了支持中文显示,防止你的文件名出现乱码问号。for %%f in (%FileType%) do:这是机器人的“循环指令”。意思就是:“去文件夹里找所有叫*.pdf的东西,每找到一个,就把它的名字记在%%f这个小本本上,然后执行后面的动作。”print /p "%%f":这是核心动作。“/p”参数表示使用默认打印机。这句话就是:“把小本本上的这个文件,扔给打印机去印。”pause:干完活了,让屏幕停一下,你别急着关闭窗口,看看有没有报错。
第三步:进阶!指定特定打印机打印
有时候,你的电脑连了几台打印机,比如“办公室彩色激光打印机”和“家用照片打印机”。默认的可能是黑的,但你想要彩色的。
这时候,print 命令的 /d 参数就派上用场了。它的格式是:/d:打印机名称,端口名称。
我们来修改一下脚本,让它支持指定打印机:
@echo off
chcp 65001 >nul
:: ========== 配置区域 ==========
:: 在这里修改你想要的打印机名称,注意名字要完全一致
set "PrinterName=Microsoft Print to PDF"
:: 如果是物理打印机,比如 "HP LaserJet Pro",请确保名称准确
set "FileType=*.docx"
:: ===============================
echo 正在连接打印机: %PrinterName%
echo 开始批量打印 Word 文档...
cd /d %~dp0
set "count=0"
for %%f in (%FileType%) do (
echo 正在打印: %%~nxf
:: /p 参数指定打印机,后面跟着打印机名称
print /p "%PrinterName%" "%%f"
set /a count+=1
)
echo.
echo 打印任务已全部提交!
echo 共计 %count% 个文件。
echo 请去打印机队列查看进度。
pause
怎么知道打印机名字对不对?
- 打开“设置” -> “蓝牙和其他设备” -> “打印机和扫描仪”。
- 找到你的打印机,点击它,查看“名称”字段。
- 把这个名字原封不动地复制到代码里的
PrinterName后面。
注意:print 命令对 Office 文档(Word/Excel)的支持其实挺一般的,有时候会卡住或者没反应。如果遇到 Word 文档打印失败,我们往下看更强大的方案。
第四步:终极方案 —— 使用 PowerShell 批量打印
如果你发现 print 命令搞不定 Word 文档,或者你想更专业地控制打印参数(比如双面打印、份数),那么 PowerShell 是我们的终极武器。
PowerShell 是 Windows 的现代版命令行工具,比批处理更强大,而且能调用 Word、Excel 等 Office 对象的后台接口。
打印 Word 文档的 PowerShell 脚本
创建一个 .ps1 文件(或者直接用记事本写好,后缀改为 .ps1):
# 设置要打印的文件夹路径,你可以改成你的文件夹路径
$folderPath = "C:\Users\YourName\Documents\待打印文档"
$wordApp = New-Object -ComObject Word.Application
$wordApp.Visible = $false # 后台运行,不显示 Word 窗口,避免弹窗打扰你
try {
# 获取文件夹下所有的 docx 文件
$files = Get-ChildItem -Path $folderPath -Filter *.docx
if ($files.Count -eq 0) {
Write-Host "哎呀,这个文件夹里没有找到 Word 文档!"
} else {
Write-Host "找到了 $($files.Count) 个 Word 文档,开始打印..."
foreach ($file in $files) {
Write-Host "正在处理: $($file.Name)" -ForegroundColor Cyan
try {
$doc = $wordApp.Documents.Open($file.FullName)
$doc.PrintOut() # 执行打印
$doc.Close($false) # 关闭文档,不保存更改
} catch {
Write-Host "打印失败: $($file.Name),错误信息: $_" -ForegroundColor Red
}
}
}
} finally {
$wordApp.Quit() # 最后一定要关掉 Word 进程,否则它会一直躲在后台吃内存
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($wordApp) | Out-Null
Write-Host "所有任务完成!Word 已关闭。"
}
Write-Host "按任意键退出..."
Read-Host | Out-Null
这个脚本厉害在哪里?
- 静默运行:
$wordApp.Visible = $false这行代码非常重要。如果没有它,你会看到屏幕上一个个 Word 窗口弹出来又关掉,非常烦人。有了它,所有操作都在后台偷偷进行。 - 容错处理:加了
try...catch,如果某个文件损坏打不开,它会报错跳过,而不是让整个脚本崩溃。 - 资源释放:最后的
finally块确保即使出错了,Word 进程也会被强制关闭。
打印 PDF 的 PowerShell 脚本
如果你想打印 PDF,但不想打开 Adobe Reader 等软件,可以用 Start-Process 调用系统的默认 PDF 关联程序:
$folder = "C:\Users\YourName\Documents\PDF文件"
$count = 0
Get-ChildItem -Path $folder -Filter *.pdf | ForEach-Object {
Write-Host "正在打印: $($_.Name)"
# shell:printto 是 Windows 的一个特殊命令,可以直接发送打印指令
# 后面跟的是文件名
Start-Process -FilePath "rundll32.exe" -ArgumentList "printui.dll,PrintUIEntry /k /n ""你的打印机名字"" ""$($_.FullName)"""
# 注意:上面的 printui 方式比较复杂且容易出错,更简单的做法是直接调用默认程序
# 下面这行更通用,会调用系统默认的 PDF 查看器进行打印
Start-Process -FilePath $_.FullName -Verb Print
$count++
Start-Sleep -Milliseconds 500 # 每个文件之间停顿一下,给打印机喘息的机会
}
Write-Host "共发送 $count 个 PDF 打印任务。"
解释一下 Start-Process ... -Verb Print:
这相当于你右键点击文件 -> 选择“打印”。它利用的是 Windows 的关联机制。只要你的电脑默认用 Adobe Acrobat 或者 Edge 打开 PDF,它就能自动调用那个程序进行打印,而不需要你自己去打开软件。
第五步:实战中的避坑指南
作为过来人,我得提醒你几个常见的“翻车”现场:
1. 打印机队列堵住了
如果你一次性打印 100 个 PDF,打印机可能会累得喘不过气,或者内存溢出导致后面的任务卡住。
建议:在脚本里加个 Start-Sleep -Seconds 2。每打印一个文件,休息 2 秒。这样打印机有足够的时间处理完当前页面,再接收下一个。虽然慢了,但稳如老狗。
2. 文件路径有空格
这是批处理新手最容易遇到的坑。比如你的文件夹叫 My Documents(中间有空格)。
如果你写 print My Documents\file.pdf,系统会以为文件名是 My,然后报“找不到文件”。
解决:永远给路径加上双引号。print "My Documents\file.pdf"。记住,带空格的路径,必须加引号。
3. 权限问题
有时候双击 .bat 或 .ps1 没反应,或者报错“拒绝访问”。
解决:右键点击脚本文件,选择“以管理员身份运行”。特别是修改打印机设置或使用某些系统级打印命令时,管理员权限更稳妥。
4. 只打印特定部分
如果你只想打印 Word 文档的第 2 到第 5 页,PowerShell 可以这样做:
$doc = $wordApp.Documents.Open("C:\path\to\file.docx")
$doc.PrintOut(Background:$false, Range:[Microsoft.Office.Interop.Word.WdPrintRange]::wdPrintPageRange, From:2, To:5)
$doc.Close($false)
这个稍微有点复杂,但如果你经常需要这样做,值得学一下。
总结:怎么选最适合你的方案?
- 如果你只是偶尔打几个 PDF 或文本文件:用 方案二(Batch 脚本)。最简单,复制粘贴改个名字就能用,无需任何额外配置。
- 如果你要批量打 Word/Excel 文档:必须用 方案四(PowerShell)。因为
print命令对 Office 文档的支持太弱了,经常打不出来或者格式错乱。 - 如果你要打印大量图片:可以用
mspaint的命令行参数,或者用 PowerShell 调用ShowPictures.ps1之类的工具,但通常批量图片打印用专门的照片管理软件(如 Windows 照片查看器)选完所有图直接点打印更方便。
最后的小贴士
写完脚本后,别急着扔在电脑里吃灰。
- 备份:把你的脚本存一个副本在云盘或者专门的“工具文件夹”里。以后换电脑或者重装系统,直接拷贝过去就能用。
- 命名规范:给你的脚本起个好名字,比如
Print_All_PDF_V2.bat,让人一眼就知道它是干嘛的。 - 测试先行:永远先用 3-5 个测试文件试跑一遍脚本,确认没问题了,再扔进去几十上百个重要文件。这可是血泪教训,别问我是怎么知道的。
希望这篇指南能帮你从“逐个打开打印”的痛苦中解脱出来。科技的意义,不就是让我们少干点重复的蠢事,多留点时间干点有趣的事吗?快去试试吧!如果有哪一步卡住了,随时回来问,我都在这里。
