如何使用PowerShell打开指定应用文件、打印并模拟点击确认后关闭应用
问题说明
你遇到的 Out-Printer 不生效是正常的:Out-Printer 仅支持将 PowerShell 控制台的输出内容直接发送到打印机,无法控制第三方应用的打印逻辑,因此不适用于你的场景。
你可以根据你使用的DAT关联应用的情况,选择以下两种方案实现需求:
方案1:使用应用自带的命令行打印参数(最稳定,优先选择)
绝大多数桌面应用都支持命令行参数直接触发打印,无需模拟用户操作,不会受桌面其他窗口干扰。操作步骤如下:
- 找到你用来打开DAT文件的目标应用的完整安装路径,比如
C:\Program Files\你的应用名称\app.exe - 查询该应用的官方说明,确认打印参数(大部分应用的打印参数为
/p、-print) - 使用如下代码执行打印:
# 替换为你的应用实际路径 $appPath = "C:\Program Files\你的应用名称\app.exe" # 替换为你要打印的文件路径 $filePath = 'C:\Users\Public\Documents\RSView Enterprise\SE\HMI Projects\printer\DLGLOG\print\2021 10 30 0000 (Float).DAT' # 调用应用打印文件,打印完成后自动退出,-Wait会等待打印任务完成再执行后续代码 Start-Process -FilePath $appPath -ArgumentList "/p `"$filePath`"" -Wait
方案2:模拟快捷键操作(仅适用于应用不支持命令行打印的场景)
如果你的应用没有提供命令行打印能力,可以通过发送系统快捷键的方式模拟点击打印、确认按钮,代码如下:
# 引入.NET窗体类库支持按键发送 Add-Type -AssemblyName System.Windows.Forms $filePath = 'C:\Users\Public\Documents\RSView Enterprise\SE\HMI Projects\printer\DLGLOG\print\2021 10 30 0000 (Float).DAT' # 启动文件并获取对应进程对象 $process = Start-Process -FilePath $filePath -PassThru # 等待应用完全启动,可根据你的应用启动速度调整等待时长(单位:毫秒) Start-Sleep -Milliseconds 2000 # 激活应用窗口,确保按键发送到正确窗口 $process | Set-ProcessWindow -Focus -ErrorAction SilentlyContinue # 如果上面的命令报错,替换为以下两行: # Add-Type -AssemblyName Microsoft.VisualBasic # [Microsoft.VisualBasic.Interaction]::AppActivate($process.Id) Start-Sleep -Milliseconds 300 # 发送Ctrl+P快捷键触发打印 [System.Windows.Forms.SendKeys]::SendWait("^p") Start-Sleep -Milliseconds 1000 # 发送回车键确认打印,如果需要选择打印机/调整参数,可以在此处插入更多按键操作 [System.Windows.Forms.SendKeys]::SendWait("{ENTER}") # 等待打印任务提交完成 Start-Sleep -Milliseconds 2000 # 关闭应用 if (!$process.HasExited) { $process.CloseMainWindow() Start-Sleep -Milliseconds 500 # 若窗口无法正常关闭则强制结束进程 if (!$process.HasExited) { $process | Stop-Process -Force } }
注意事项:
- 脚本运行期间不要操作鼠标键盘,避免按键发送到其他窗口
- 要是你的打印确认窗口需要额外操作(比如选择指定打印机、调整打印份数),可以在发送
^p之后插入对应的Tab切换、按键输入代码 - 如果需要更稳定的无干扰操作,可以使用Windows UI Automation库定位打印按钮控件直接点击,比全局发送按键的容错性更高
内容的提问来源于stack exchange,提问作者James Wayne
相关产品推荐
相关产品推荐

