如何编写Windows 10脚本实现打印作业完成时按日自动递增计数
Windows 10 打印作业自动按日计数实现方案
核心原理
不用写常驻后台的轮询脚本,直接用Windows系统原生的打印事件日志做触发源,准确率高、资源占用极低:
- 打印作业正常完成时,系统会自动在
Microsoft-Windows-PrintService/Operational日志下写入ID为307的事件,记录作业完成状态,这个是系统级的记录,不会漏判、误判 - 触发事件后自动运行计数脚本,按当前日期生成独立的txt计数文件,当日所有完成的打印作业累加计数,跨天自动生成新文件,无需手动维护
- 计数逻辑做异常兼容,就算计数文件被意外改坏也不会导致脚本崩溃
具体操作步骤
1. 先开启打印事件日志
默认状态下打印服务的操作日志可能处于关闭状态,需要手动开启:
- 打开事件查看器,依次展开
应用程序和服务日志 > Microsoft > Windows > PrintService - 右键点击
Operational项,选择「属性」,勾选「启用日志记录」,日志大小默认给的1024KB足够存几个月的打印记录,不用改
2. 编写计数脚本
新建文本文件,把下面的PowerShell代码粘贴进去,保存后把后缀名改成.ps1,比如命名为PrintCountUpdater.ps1,放到固定目录比如C:\PrintCountTool\下,不要随意移动删除:
# 按当前年月日生成对应日期的计数文件,文件和脚本存在同一目录 $currentDate = Get-Date -Format "yyyyMMdd" $countFile = Join-Path $PSScriptRoot "print_count_$currentDate.txt" $count = 1 # 检查当天计数文件是否存在,存在则读取现有数值累加 if (Test-Path $countFile) { $rawValue = Get-Content $countFile -Raw -ErrorAction SilentlyContinue # 校验文件内容是否为合法数字,避免文件损坏导致脚本报错 if ([int]::TryParse($rawValue.Trim(), [ref]$count)) { $count++ } else { $count = 1 } } # 写入更新后的计数值 Set-Content -Path $countFile -Value $count -Encoding UTF8
3. 配置事件自动触发规则
用系统自带的任务计划程序绑定打印完成事件,实现事件触发时自动跑脚本,不需要脚本常驻后台:
- 打开任务计划程序,选择「创建任务」,名称填「打印作业自动计数」,安全选项勾选「使用最高权限运行」,选择「不管用户是否登录都要运行」
- 切换到「触发器」标签,新建触发器,开始任务的类型选「发生事件时」,日志选择
Microsoft-Windows-PrintService/Operational,源选PrintService,事件ID填写307,点击确定 - 切换到「操作」标签,新建操作,操作类型选「启动程序」,程序路径填
powershell.exe,参数栏填-ExecutionPolicy Bypass -File "C:\PrintCountTool\PrintCountUpdater.ps1",注意路径要和你实际存放脚本的路径一致 - 切换到「设置」标签,把「如果任务运行超过以下时间则停止」的阈值改成1分钟,避免脚本异常卡后台,其余选项保持默认即可
- 点击确定保存,按照提示输入当前系统账号的密码,配置就全部完成了
补充说明
- 所有计数文件都存在脚本所在的文件夹,文件名格式为
print_count_年月日.txt,直接打开就能看到对应日期的打印作业总数量,比如print_count_20240520.txt里存的数字就是2024年5月20日的总打印完成量 - 如果需要过滤不需要计数的作业(比如测试页、特定文档名的打印任务),可以在脚本里读取307事件携带的文档名称、打印用户名等字段做判断,匹配到过滤规则就跳过计数即可,具体字段内容可以在事件查看器的307事件详情里查看
- 整套方案全靠Windows原生功能实现,不需要安装任何第三方软件,平时没有任何后台资源占用,只有打印作业完成的瞬间会触发脚本运行1秒左右,稳定性很高
内容的提问来源于stack exchange,提问作者tompos
相关产品推荐
相关产品推荐

