有没有PowerShell命令可后台静默打印PDF与Word文档?
静默打印Word和PDF文档的PowerShell方案
你之前用Get-Content -Path [path] | Out-Printer的方法之所以失效,是因为这个命令只是读取文件的纯文本内容并传递给打印机,没有调用对应文档格式的打印驱动,所以会触发打开关联程序且无法完成正确打印。下面是两种文档类型的静默打印方案:
Word文档静默打印
利用Word的COM自动化接口,能实现完全后台打印,不会弹出Word窗口:
# 替换为你的Word文档路径 $docPath = "C:\Example\Document.docx" $wordApp = New-Object -ComObject Word.Application $wordApp.Visible = $false # 强制隐藏窗口 $document = $wordApp.Documents.Open($docPath) $document.PrintOut() $document.Close() $wordApp.Quit() # 释放COM对象,避免残留Word进程 [System.Runtime.Interopservices.Marshal]::ReleaseComObject($document) | Out-Null [System.Runtime.Interopservices.Marshal]::ReleaseComObject($wordApp) | Out-Null [System.GC]::Collect() [System.GC]::WaitForPendingFinalizers()
- 前提是系统已安装Microsoft Office Word组件
- 若打印时需要调整参数(比如指定打印机、份数),可以给
PrintOut()方法传递对应参数,比如$document.PrintOut($false, $false, $null, $null, "打印机名称")
PDF文档静默打印
方法1:Windows Shell原生方法(无需额外软件)
通过Shell.Application调用PrintTo动词,实现后台打印,部分PDF阅读器会在后台短暂运行但不显示窗口:
$pdfPath = "C:\Example\File.pdf" # 可通过Get-Printer命令获取你的打印机名称,留空则用默认打印机 $printerName = "你的打印机名称" $shell = New-Object -ComObject Shell.Application $folder = $shell.Namespace((Split-Path $pdfPath -Parent)) $fileItem = $folder.ParseName((Split-Path $pdfPath -Leaf)) # 调用静默打印 if ($printerName) { $fileItem.InvokeVerbEx("PrintTo", $printerName) } else { $fileItem.InvokeVerbEx("Print") } # 释放COM对象 [System.Runtime.Interopservices.Marshal]::ReleaseComObject($fileItem) | Out-Null [System.Runtime.Interopservices.Marshal]::ReleaseComObject($folder) | Out-Null [System.Runtime.Interopservices.Marshal]::ReleaseComObject($shell) | Out-Null [System.GC]::Collect() [System.GC]::WaitForPendingFinalizers()
方法2:Ghostscript(更彻底的无界面打印)
如果需要完全无任何后台进程弹出,可以安装Ghostscript(开源免费)后使用命令行打印:
# 替换为你的Ghostscript安装路径和打印机名称 $gsPath = "C:\Program Files\gs\gs10.02.1\bin\gswin64c.exe" $printer = "你的打印机名称" $pdfPath = "C:\Example\File.pdf" & $gsPath -dPrinted -dBATCH -dNOPAUSE -dNOSAFER -q -sDEVICE=mswinpr2 -sOutputFile="%printer%$printer" $pdfPath
- Ghostscript官网可下载安装包,安装后注意替换路径中的版本号
- 此方法不依赖任何PDF阅读器,完全在命令行后台执行
内容的提问来源于stack exchange,提问作者user21520585
相关产品推荐
相关产品推荐

