Windows任务计划执行bat/py文件时如何避免打印尺寸错误?
问题描述
我正在执行一项从手持设备通过Windows服务器向打印机发送信息的任务,通过批处理文件(bat)启动Python文件实现:
批处理文件代码
title "RestApi" call D:\ProgramData\Miniconda3\Scripts\activate.bat start "Rest" D:\ProgramData\Miniconda3\python.exe D:\path\Rest.py
Python打印代码
cmd = f'mspaint /pt ' + r'card.png ' + '"' + printer + '"' print(cmd) p = subprocess.Popen(cmd, shell=True)
核心问题:以管理员身份手动启动bat文件时打印正常,但通过Windows任务计划以SYSTEM账户执行时,打印尺寸错误,部分内容无法显示。已尝试直接在任务计划中执行python.exe并传入Python文件参数,但无效。
原因分析
- 账户环境差异:SYSTEM账户与普通管理员账户拥有独立的打印机配置环境。手动运行时使用的是当前管理员用户的打印机偏好(含#9信封的尺寸配置),而SYSTEM账户的默认纸张规格可能并非#9信封,导致mspaint调用时使用错误参数。
- mspaint参数局限性:
mspaint /pt命令完全依赖当前用户的打印机默认设置,SYSTEM账户下未配置目标打印机的默认纸张为#9信封,因此触发尺寸错误。 - 工作目录与权限问题:SYSTEM账户执行任务时的默认工作目录并非脚本所在路径,若
card.png使用相对路径,可能导致图片加载异常,间接引发打印尺寸错误。
解决办法
1. 配置SYSTEM账户的打印机默认纸张
- 使用
psexec -i -s cmd.exe(需PsTools工具)打开SYSTEM权限的命令提示符。 - 在该窗口中打开控制面板的打印机设置,找到目标打印机,进入打印首选项,将默认纸张尺寸设置为#9信封并保存。
2. 替换mspaint,使用可控的打印库
改用win32print+PIL组合直接控制打印参数,避免依赖默认设置:
import win32print import win32ui from PIL import Image # 目标打印机名称 printer_name = printer # 替换为你的打印机变量 img_path = r"D:\path\card.png" # 图片绝对路径 # 打开打印机并设置纸张尺寸(#9信封对应PaperSize=20,需根据打印机支持情况调整) hprinter = win32print.OpenPrinter(printer_name) devmode = win32print.GetPrinter(hprinter, 2)["pDevMode"] devmode.PaperSize = 20 win32print.SetPrinter(hprinter, 2, devmode, 0) win32print.ClosePrinter(hprinter) # 执行打印 img = Image.open(img_path) hDC = win32ui.CreateDC() hDC.CreatePrinterDC(printer_name) hDC.StartDoc("Card Print") hDC.StartPage() # 适配信封尺寸拉伸图片 hDC.StretchBlt((0, 0, devmode.PaperWidth, devmode.PaperHeight), img, (0, 0, img.width, img.height)) hDC.EndPage() hDC.EndDoc()
3. 修改任务计划的执行账户
将任务计划的执行账户从SYSTEM改为手动运行正常的管理员账户:
- 打开任务计划程序,进入目标任务的属性→安全选项。
- 选择“不管用户是否登录都要运行”,指定已配置好打印机的管理员账户并输入密码保存。
4. 修正Python中的文件路径
确保card.png使用绝对路径,避免SYSTEM账户工作目录不匹配的问题:
img_path = r"D:\path\card.png" # 替换为实际绝对路径 cmd = f'mspaint /pt "{img_path}" "{printer}"'
内容的提问来源于stack exchange,提问作者ChrisKu
相关产品推荐
相关产品推荐

