如何在PowerShell脚本中调用MS Word原生打印对话框
解决方案
直接通过Word COM对象内置的Dialogs接口即可唤起原生打印对话框,无需使用Start-Process调用外部指令:
- 你之前用的
Start-Process -FilePath .\test.docx -Verb Print触发的是Word的快捷打印动作,默认直接将任务发送到默认打印机,不提供交互界面,所以会出现窗口闪一下就关闭的情况 - 不要在弹出打印窗口前执行
$Word.Quit()和COM资源释放逻辑,必须等用户完成打印交互后再做清理 - Word内置的
wdDialogFilePrint对话框(枚举值为88)就是你需要的原生打印界面,调用其Show()方法即可弹出,支持所有Word自带的打印配置项。
修正后的可运行脚本
$Word = New-Object -ComObject Word.Application # 必须设置Word可见,否则可能出现对话框无法前台显示、后台进程残留的问题 $Word.Visible = $true $Document = $Word.Documents.Add() $Selection = $Word.Selection # 原有文档编辑逻辑 $Selection.Font.Size = 16 $Selection.Font.Bold = 1 $Selection.TypeText("DATA") $Selection.Font.Bold = 0 $Selection.Font.Size = 12 $Selection.TypeParagraph() $Selection.TypeText("Name: `vLast Name:") $Report = Join-Path $PSScriptRoot "test.docx" # 修复原脚本未定义SaveFormat枚举的问题,传值16对应标准docx格式(wdFormatXMLDocument) $Document.SaveAs([ref]$Report, [ref]16) # 唤起Word原生打印对话框 $printDialog = $Word.Dialogs.Item(88) # 脚本会阻塞在这里,直到用户关闭打印对话框(点确认打印/取消) $null = $printDialog.Show() # 交互完成后再退出Word、清理COM资源 $Word.Quit() $null = [System.Runtime.InteropServices.Marshal]::ReleaseComObject([System.__ComObject]$Word) [gc]::Collect() [gc]::WaitForPendingFinalizers() Remove-Variable Word
其他说明
- 弹出的对话框就是Word自带的传统打印窗口,支持选打印机、设置页码范围、打印份数、双面打印、缩放等所有原生功能,和你手动在Word里点文件-打印弹出的界面完全一致。
- 如果需要预设打印参数,可以在调用
Show()前给$printDialog的对应属性赋值,比如要默认设置2份打印,加一行$printDialog.Copies = 2即可。 - 如果需要判断用户是点击了「打印」还是「取消」,可以判断
$printDialog.Show()的返回值:返回-1代表用户确认打印,返回0代表用户点击取消。
内容的提问来源于stack exchange,提问作者lucaortis
相关产品推荐
相关产品推荐

