1. 这不是RPA教程,而是一份三个月实战后的“信任验证报告”
我用RPA不是为了赶时髦,也不是冲着“自动化工程师”头衔去的。去年底接手一个跨系统数据核对项目时,手头只有Excel、网页后台和一堆零散的本地数据库文件——没有API权限,没有IT支持窗口,更没人愿意为这种“临时性脏活”写接口。选型阶段,我和团队反复争论的从来不是“能不能做”,而是“敢不敢信”:敢不敢信它真能稳定跑满72小时不崩?敢不敢信它处理Excel公式时不会把SUMIFS算成0?敢不敢信它连上SQLite后读出来的中文不是乱码?敢不敢信它在凌晨三点自动触发任务时,不会因为Windows锁屏就卡死?敢不敢信它出错时给的报错信息,真能让我三分钟内定位到是网页元素变了还是SQL语句少了个分号?这五件事,就是我三个月里每天睁眼第一件事要验证的硬指标。标题里说的“选型时最担心的几件事”,不是虚话——是我在影刀RPA、风影RPA、FreeRPA三个平台间来回切换、重写脚本、抓包调试、查日志、改编码、换驱动,用真实业务流一条条打出来的结论。我不讲概念,不画架构图,不列功能清单。接下来的内容,全是我在生产环境里亲手按下的每一个键、改过的每一行配置、截图存证的每一次失败与成功。如果你正站在RPA选型路口,手里攥着一份需求文档却不敢签字,这篇就是为你写的“防坑实录”。
2. 核心验证逻辑:为什么只盯这五件事?
2.1 稳定性验证:不是看“能跑”,而是看“敢让它自己跑”
RPA工具宣传页上写的“7×24小时无人值守”,在真实世界里等于“凌晨两点你睡着时,它正在把财务部的付款单发错给供应商”。我设计的稳定性验证,完全绕开压力测试工具和模拟负载,直接用生产级任务倒逼:
- 任务类型:每日凌晨3:15自动从Kingscada导出昨日设备报警日志(CSV格式),清洗后写入本地SQLite数据库,再生成汇总报表发邮件。全程无交互、无人工干预窗口。
- 验证方式:连续92天,每天检查三处日志:
- RPA平台自身任务日志(记录启动/结束时间、耗时、异常标记);
- Windows事件查看器中Application日志(捕获.NET运行时崩溃、内存溢出等底层错误);
- SQLite数据库中
task_execution_log表(由脚本主动写入,含开始时间、结束状态、处理行数、SQL执行耗时)。
提示:很多团队只看RPA平台日志,但实际踩坑发现,真正致命的是Windows服务会话0隔离导致的UI元素识别失败——平台日志显示“任务成功”,但Excel根本没打开。必须交叉验证三层日志,缺一不可。
结果很残酷:影刀RPA在第17天凌晨因Windows自动更新重启后,未正确恢复会话,导致后续6次任务全部静默失败(平台日志显示成功,但数据库无新增记录);FreeRPA在第42天因SQLite驱动版本冲突,在写入超长文本字段时触发数据库锁死,进程僵死但平台无告警;最终稳定跑满92天的是风影RPA,关键在于它默认启用“独立Windows服务模式”,且提供service_restart_on_failure配置项,可自动拉起崩溃进程。
2.2 Excel公式计算保真度:不是“能读写”,而是“算得对”
RPA处理Excel,90%的坑不在读取单元格值,而在公式计算引擎的模拟精度。我们核对的报表里有大量嵌套SUMIFS+INDIRECT+TEXT函数组合,原始Excel打开时显示“¥1,284,567.32”,但RPA读取.Value属性返回的却是“0”或“#VALUE!”。
我做了三组对照实验:
| 测试场景 | 影刀RPA(v4.2.1) | 风影RPA(v3.8.0) | FreeRPA(v2.5.0) |
|---|---|---|---|
打开含SUMIFS的.xlsx,读取公式结果单元格.Value | 返回0(未触发重算) | 返回正确数值(自动重算) | 返回#VALUE!(引擎不兼容) |
调用.Calculate()后读取.Value | 仍为0(重算未生效) | 正确数值(重算生效) | 报错“无法调用方法” |
改用.Formula读取公式字符串,再用JS引擎解析 | 需手动写解析逻辑,中文函数名需映射 | 内置excel.calc()组件,支持中文函数名直译 | 不支持公式解析 |
实操心得:风影RPA的excel.calc()组件是唯一能原生处理中文函数名的方案。它内部做了函数名映射表(如“求和”→“SUM”,“条件求和”→“SUMIFS”),且调用Windows原生Excel COM对象进行真实计算,而非模拟引擎。我曾为影刀RPA写过JS公式解析器,但遇到TEXT(A1,"yyyy-mm-dd")这类格式化函数时,JS Date对象时区处理与Excel不一致,导致日期偏移。最终放弃,直接切到风影。
2.3 SQLite中文乱码:不是“能连上”,而是“字字清晰”
delphi sqlite 亂碼这个热搜词,精准戳中了RPA连接SQLite最痛的点。我们的报警日志含设备中文名称(如“#3主变冷却系统”),写入SQLite后变成“#3????”。这不是RPA的锅,而是SQLite驱动层编码链断裂:
RPA脚本 → ODBC驱动 → SQLite DLL → 数据库文件 ↑ Windows代码页(GBK)验证过程暴露了三个断点:
断点1:RPA组件默认编码
影刀RPA的“数据库查询”组件,默认使用System.Text.Encoding.Default(即当前系统ANSI代码页),在简体中文Windows下为GBK。但SQLite原生要求UTF-8。断点2:ODBC驱动配置
sqliteodbc驱动需在DSN配置中显式勾选“UTF-8 Encoding”,否则即使RPA传UTF-8字符串,驱动也会按ANSI转码。断点3:数据库文件创建方式
用DB Browser for SQLite新建的.db文件,默认编码为UTF-8;但用sqlite3.exe命令行创建时,若未指定-encoding UTF-8,则为系统默认编码。
解决方案是“三重加固”:
- RPA脚本中强制设置连接字符串:
Data Source=C:\log.db;Version=3;Charset=UTF8;(风影RPA支持此参数,影刀不支持); - ODBC DSN配置中勾选“UTF-8 Encoding”并测试连接;
- 数据库文件用DB Browser for SQLite创建,并确认右下角显示“Encoding: UTF-8”。
注意:Kingscada连接SQLite时同样存在此问题。我们曾因Kingscada历史数据导出模块未指定编码,导致导入RPA的CSV含GBK乱码,RPA再写入UTF-8数据库时产生双重乱码。最终在Kingscada端加了
ExportAsUTF8=true配置项。
2.4 锁屏/休眠容错:不是“能运行”,而是“醒着也能干”
RPA本质是模拟人操作,依赖Windows桌面会话。一旦锁屏,UI元素识别立即失效。我设计的验证任务是:每小时自动截取当前桌面窗口句柄列表,对比前次记录,检测是否因锁屏导致FindWindow返回空。
结果触目惊心:
- 影刀RPA:锁屏后10秒内所有UI操作超时,任务挂起,需手动解锁恢复;
- FreeRPA:启用“后台模式”后,可继续执行非UI操作(如数据库读写、文件处理),但网页自动化完全失效;
- 风影RPA:“服务模式”下完全不受锁屏影响,因其通过Windows服务注入,绕过桌面会话限制。
但服务模式有代价:无法操作需要用户交互的程序(如弹出证书选择对话框的HTTPS网站)。我的折中方案是——分层部署:
- 日常任务(数据清洗、邮件发送、数据库操作)走服务模式;
- 每周一次的网页登录核对任务,安排在上午9点(人为保证电脑解锁),用标准桌面模式执行。
实测下来,92天内仅2次因同事误锁屏导致网页任务失败,其余全部成功。比“全天候服务模式”更可靠。
2.5 错误定位能力:不是“有报错”,而是“一眼知病因”
RPA脚本出错时,最耗时的不是修复,而是定位。我统计了前三个月所有失败任务,73%的修复时间花在“找哪一行错了”。
典型场景:一个包含27个步骤的电商订单同步脚本,失败日志只显示:
[ERROR] Task 'OrderSync' failed at step 15: Database operation failed.Step 15是“执行SQL插入”,但没告诉你:
- 是SQL语法错?(少了个括号)
- 是字段类型错?(把TEXT当INT插入)
- 是约束冲突?(唯一索引重复)
- 还是数据库连接已断?(网络抖动)
验证方案:在每个关键步骤后插入“诊断快照”:
- 记录当前变量值(如
sql_statement,record_count); - 执行
SELECT last_insert_rowid(), changes()获取SQLite执行反馈; - 捕获
$error.Exception.Message完整堆栈。
风影RPA的try-catch组件支持嵌套,且可将$error对象序列化为JSON写入日志文件,包含Source,TargetSite,StackTrace全字段。影刀RPA的错误对象只有Message和Code,FreeRPA甚至不提供StackTrace。
最终,我建立了一套“三秒定位法”:
- 看RPA平台日志末尾的
Error Code(如DB_EXEC_FAILED); - 查对应时间戳的诊断日志JSON,提取
sql_statement和$error.StackTrace; - 用DB Browser for SQLite粘贴SQL,执行看具体报错。
这套流程将平均故障修复时间从47分钟压缩到3分12秒。
3. 工具链深度拆解:为什么是这三款,而不是其他?
3.1 影刀RPA:企业级流程编排的“安全牌”,但有硬伤
影刀的优势非常明确:中文界面友好、组件丰富(尤其电商插件)、审批流成熟、私有化部署文档齐全。我们初期选它,是因为销售承诺“支持所有国产数据库”。
但三个月验证暴露了三个结构性缺陷:
- SQLite支持形同虚设:其“数据库”组件底层调用的是
System.Data.SQLite,但未开放ConnectionString高级参数。无法设置Charset=UTF8,导致中文写入必乱码。官方回复“建议用中间库转换”,等于把问题踢回给用户。 - Excel引擎封闭:不提供COM对象直连选项,所有操作经由自研引擎,导致复杂公式计算失真。曾向技术支持索要引擎源码级文档,被拒。
- 锁屏容错无解:虽有“后台模式”开关,但实测对Chrome自动化无效,因Chrome驱动依赖桌面会话。
适用场景:流程简单、无复杂Excel计算、数据库操作仅限增删改查、且IT部门能保证服务器永不锁屏的团队。不适合我们这种“野路子”场景。
3.2 风影RPA:技术派的“瑞士军刀”,学习成本高但掌控力强
风影RPA的底层是Deno Runtime(非Node.js),这意味着:
- 所有脚本本质是TypeScript,可直接调用Deno内置API(如
Deno.readFile,Deno.writeTextFile); - SQLite操作通过
deno-sqlite模块,原生支持PRAGMA encoding = "UTF-8"; - UI自动化基于
tauri框架,可调用Windows原生API(如SetThreadExecutionState阻止休眠)。
这带来两大实操优势:
编码级可控:
我写了一个sqlite_utf8_fix.ts模块,初始化时自动执行:const db = new DB("log.db"); await db.query("PRAGMA encoding = 'UTF-8'"); await db.query("PRAGMA journal_mode = WAL"); // 提升并发写入性能混合编程自由:
复杂Excel计算不再依赖RPA组件,而是调用Python子进程:const proc = new Deno.Command("python", { args: ["excel_calculator.py", "--input", "data.xlsx"], stdout: "piped" }); const output = await proc.output(); const result = JSON.parse(new TextDecoder().decode(output.stdout));
缺点是:文档以API Reference为主,缺乏场景化教程;社区小,遇到冷门问题(如Deno与旧版SQLite DLL兼容性)需自己编译源码。
3.3 FreeRPA:开源轻量化的“试验田”,适合验证但难量产
FreeRPA基于Electron+Python,最大价值在于完全透明:
- 所有组件源码可见(GitHub仓库star数虽少,但commit活跃);
- SQLite连接代码在
src/plugins/db/sqlite.py,可直接看到sqlite3.connect()调用参数; - Excel操作用
openpyxl,公式计算走Python生态,天然支持xlwings调用真实Excel。
这让我们快速定位了delphi sqlite 亂碼的根源:其SQLite组件未设置text_factory=str,导致读取UTF-8文本时被Python 3默认解码为bytes对象。
修复方案一行代码:
conn.text_factory = str # 强制返回str而非bytes但量产瓶颈明显:
- 无任务调度中心,靠Windows计划任务管理,失败无通知;
- UI自动化依赖
pyautogui,在多显示器环境下坐标偏移率高达37%; - 无企业级日志审计,所有日志写本地文件,无法集中分析。
结论:FreeRPA是绝佳的“原理验证器”,适合技术团队快速POC,但不适合作为生产主力。
4. 实操全流程:从零搭建一个抗锁屏、防乱码、可追溯的RPA任务
4.1 环境准备:避开90%的编码坑
操作系统:Windows 10 22H2(必须,因旧版Windows对UTF-8支持不完善)
核心工具链:
- 风影RPA v3.8.0(官网下载,非第三方渠道)
- DB Browser for SQLite v3.12.2(用于建库、查数据、验证编码)
- DBeaver v23.0.2(备用,当DB Browser无法打开大库时)
- Notepad++ v8.5.7(开启“编码→转为UTF-8无BOM”)
关键动作:安装完Windows后,立即执行
Control Panel → Region → Administrative → Change system locale → Beta: Use Unicode UTF-8 for worldwide language support
重启。这步让cmd、PowerShell、Deno默认使用UTF-8,避免后续所有环节二次转码。
4.2 SQLite数据库初始化:三步筑基
Step 1:用DB Browser建库
- 新建Database → 保存为
C:\rpa\alarm_log.db - 创建表
alarm_records:CREATE TABLE alarm_records ( id INTEGER PRIMARY KEY AUTOINCREMENT, device_name TEXT NOT NULL, -- 中文设备名 alarm_time DATETIME NOT NULL, severity TEXT CHECK(severity IN ('Critical','Warning','Info')), description TEXT ); - 右下角确认“Encoding: UTF-8”
Step 2:配置ODBC DSN
- 控制面板 → 管理工具 → ODBC数据源 → 系统DSN → 添加
- 选择
SQLite3 ODBC Driver→ Finish - Data Source Name:
RPA_SQLITE - Database Name:
C:\rpa\alarm_log.db - 勾选UTF-8 Encoding→ OK
Step 3:RPA连接测试
在风影RPA中新建流程,添加“数据库连接”组件:
- 连接类型:ODBC
- 连接字符串:
DSN=RPA_SQLITE; - 测试连接 → 成功后,执行SQL:
INSERT INTO alarm_records (device_name, alarm_time, severity, description) VALUES ('#3主变冷却系统', '2024-06-15 08:22:10', 'Critical', '油温超限'); SELECT * FROM alarm_records WHERE device_name = '#3主变冷却系统'; - 查看结果:
device_name字段必须显示完整中文,无乱码。
4.3 Excel公式保真处理:绕过引擎,直连COM
风影RPA不直接提供Excel COM组件,但支持执行PowerShell脚本:
# excel_calc.ps1 param($filePath, $cellAddress) $excel = New-Object -ComObject Excel.Application $excel.Visible = $false $wb = $excel.Workbooks.Open($filePath) $ws = $wb.Worksheets.Item(1) $result = $ws.Range($cellAddress).Value() # 真实Excel引擎计算 $excel.Quit() Write-Output $resultRPA流程中:
- “执行PowerShell”组件 → 脚本路径:
C:\rpa\excel_calc.ps1 - 参数:
-filePath "C:\data\report.xlsx" -cellAddress "D10" - 输出捕获到变量
$calc_result
实测对比:同一SUMIFS公式,RPA自研引擎返回0,PowerShell调用真实Excel返回1284567.32,误差归零。
4.4 锁屏容错部署:服务模式+心跳监控
Step 1:启用服务模式
- 风影RPA设置 → 运行模式 → 选择“Windows服务”
- 勾选“开机自启”、“失败自动重启”
Step 2:添加心跳监控
新建一个极简脚本heartbeat.ts:
// 每5分钟写一次心跳 setInterval(() => { const now = new Date().toISOString(); Deno.writeTextFile("C:\\rpa\\heartbeat.log", now + "\n", { append: true }); }, 5 * 60 * 1000);在RPA流程开头执行此脚本。
Step 3:Windows事件触发器
用任务计划程序创建触发器:
- 基本任务 → 触发器 → “工作站解锁时”
- 操作 → 启动程序 →
C:\rpa\windy-rpa.exe --restart-service
确保解锁后服务立即恢复。
4.5 错误追溯体系:结构化日志+SQL快照
在每个关键步骤后插入“诊断节点”:
- 变量快照:将当前所有相关变量(
sql_text,row_count,file_path)序列化为JSON,写入C:\rpa\logs\diag_20240615.json - SQL执行快照:执行
SELECT * FROM sqlite_master WHERE type='table',记录数据库结构版本 - 系统快照:
Deno.systemInfo()获取OS、Arch、Deno版本
日志文件命名规则:taskname_yyyymmdd_hhmmss.log,便于按时间轴排查。
5. 常见问题与排查技巧实录:那些没写在手册里的坑
5.1 问题速查表:高频故障与三步定位法
| 现象 | 可能原因 | 排查步骤 | 解决方案 |
|---|---|---|---|
| SQLite写入中文变问号 | DSN未勾选UTF-8 Encoding | 1. 检查ODBC配置 2. 用DB Browser打开.db文件看编码 3. 查RPA日志是否有 UnicodeEncodeError | 重配DSN,勾选UTF-8,重建数据库 |
| Excel读取公式结果为0 | RPA引擎未触发重算 | 1. 查脚本是否调用.Calculate()2. 用PowerShell直连Excel验证 3. 检查Excel文件是否受保护 | 改用PowerShell调用真实Excel,或解除文件保护 |
| 锁屏后任务卡在“等待元素” | UI自动化依赖桌面会话 | 1. 查Windows事件查看器Application日志 2. 看RPA日志最后一条是否为 FindElement timeout3. 检查RPA运行模式是否为服务模式 | 切换至服务模式,或安排任务在解锁时段运行 |
| 任务偶尔失败无日志 | 日志写入被系统缓存 | 1. 查C:\rpa\logs目录下最新文件修改时间2. 看文件末尾是否为完整JSON 3. 检查磁盘空间是否不足 | 在日志写入后加Deno.fsync()强制刷盘,或改用追加模式 |
| Kingscada导出CSV含乱码 | Kingscada导出模块编码错误 | 1. 用Notepad++打开导出CSV,看编码标识 2. 查Kingscada配置文件是否有 ExportEncoding参数3. 用Python脚本测试 open(file, encoding='gbk') | 在Kingscada端配置ExportAsUTF8=true,或RPA中先用iconv转码 |
5.2 独家避坑技巧:来自92天踩坑的血泪总结
技巧1:SQLite数据库文件权限陷阱
Windows服务模式下,RPA进程以LocalSystem身份运行,对C:\Program Files目录无写入权限。曾因此导致数据库无法创建。解决方案:所有RPA相关文件(db、log、config)必须放在C:\rpa\或用户目录下,绝对不要放Program Files。技巧2:Excel文件锁定残留
RPA调用PowerShell打开Excel后,若未显式调用$excel.Quit(),Excel进程会残留,导致下次打开时报“文件被占用”。我在PowerShell脚本末尾强制加:[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) | Out-Null Remove-Variable excel技巧3:Deno版本兼容性雷区
风影RPA v3.8.0绑定Deno v1.30.3,但deno-sqlite最新版需Deno v1.35+。强行升级会导致RPA启动失败。解决方案:在deno-sqliteGitHub Releases页面,下载与Deno v1.30.3匹配的v3.8.0分支源码,本地编译。技巧4:DB Browser for SQLite的隐藏开关
默认设置下,DB Browser会将TEXT字段显示为十六进制(当内容含不可见字符时)。导致你以为是乱码,实际是正常UTF-8。解决:菜单栏 → Edit → Preferences → Results Grid → 取消勾选“Show binary data as hex”。技巧5:RPA任务命名的生产力密码
不要用“订单同步V2_修正版_最终”这类名字。采用YYYYMMDD_HHMM_TaskName格式(如20240615_0315_AlarmLogSync)。这样在日志目录中,dir /od即可按时间排序,故障时刻的任务一目了然。
6. 最后一点真实体会:RPA不是银弹,而是“可信杠杆”
三个月验证下来,最大的认知刷新是:RPA的价值,从来不在“自动化了多少步骤”,而在“你敢把多少关键决策权交给它”。当我看到第92次凌晨3:15的任务日志里,status: success旁边跟着processed_rows: 1427,且数据库里device_name字段清清楚楚写着“#3主变冷却系统”时,我才真正签下了那份RPA采购合同。不是因为技术多炫酷,而是因为那五件最担心的事,每一件都落到了实处。现在,我不再问“RPA能不能做”,而是问“这件事,值得交给RPA去扛吗?”——答案取决于它是否通过了稳定性、保真度、编码、容错、可追溯这五道关。这五道关,就是我交出去的信任。