影刀RPA 变量管理面板详解:局部变量、全局变量、流程参数的区别与选择 影刀RPA 变量管理面板详解局部变量、全局变量、流程参数的区别与选择新手写流程最容易被变量搞晕——为什么这个变量在子流程里取不到为什么值莫名其妙变了为什么流程参数和局部变量好像都能用不知道选哪个这篇文章把影刀的三种变量类型讲清楚有什么区别、各自适用什么场景、选错了有什么后果。三种变量的本质区别影刀的变量体系分三层类型作用域生命周期定义位置局部变量当前流程文件内流程运行期间流程编辑器的变量管理面板全局变量所有流程文件跨子流程持续存在项目级别的全局变量管理流程参数当前流程文件流程运行期间流程参数面板入口和出口一句话区分局部变量是私有的全局变量是公共的流程参数是门口的收发室。影刀新建一个变量时默认是局部变量。只有你主动去全局变量管理里定义的变量才是全局的。局部变量默认首选局部变量是你在流程里拖入一个动作后在属性面板里顺手创建的那些。遵循在哪定义在哪使用的原则。定义方式在任意动作的属性配置里点击变量选择框旁边的新建按钮或者在左侧变量管理面板里直接新建变量类型字符串、数字、布尔值、列表、字典、元素对象等作用域限制主流程里定义的局部变量子流程访问不到子流程里定义的局部变量主流程也拿不到每个流程文件有自己的局部变量空间互不干涉# 主流程 main.flow局部变量orders[100,200,300]# 调用子流程 sub.flow# sub.flow 里访问不了 main.flow 的 orders# 子流程 sub.flow局部变量orders[]# 这是另一个 orders和主流程的无关什么时候用局部变量99%的场景。处理中间结果、循环计数、临时存储、状态标记——这些都不需要暴露给其他流程用局部变量最干净。局部变量的好处是隔离性。你改一个局部变量的值不会影响任何其他流程。调试的时候也省心——出问题肯定是当前文件里的事不用满项目找谁改了这个变量。全局变量跨流程共享全局变量的作用域是整个项目任何一个流程文件都能读、都能写。定义方式在影刀顶部菜单 → 全局变量管理 → 新建或者在变量选择框里切换到全局变量标签页新建全局变量什么时候必须用全局变量以下三种场景不用全局变量几乎没法做场景1保存运行状态。定时任务每次运行时需要知道上次跑到哪了。这个信息存在全局变量里重启也保留前提是影刀进程没结束。主流程 【读取全局变量】last_page g_last_page IF last_page 为空 → last_page 1 从第 last_page 页开始采集 子流程分页脚本 每采集完一页 【设置全局变量】g_last_page current_page 1场景2全局配置信息。数据库连接信息、API密钥、邮件服务器地址——这些在每个流程里都要用不想每个流程文件里重复定义一遍。全局变量 g_db_host 192.168.1.100 g_db_user rpa_user g_db_pass xxxxxx 任何子流程里都能直接读取这些全局变量不需要通过参数传递。场景3跨流程的状态通知。A子流程在处理数据时发现一个严重错误需要告诉主流程别继续了快停。通过全局变量做标志位数据采集子流程 发现网络断了 → 【设置全局变量】g_emergency_stop True 主流程在每个子流程后检查 【读取全局变量】IF g_emergency_stop True → 停止所有后续操作发告警全局变量的隐患全局变量的便利背后有一个致命问题任何流程都能改任何值出bug时不知道谁改的。具体表现A流程把g_status设为完成B流程不知情把它改成失败调试时发现全局变量值不对但整个项目几十个流程文件不知道哪个环节改的多个子流程同时修改同一个全局变量如果有并发值直接乱了使用原则全局变量只做读多写少的事——配置、状态标志不要用全局变量传大数据几千条数据用文件/数据库中转给全局变量起一个辨识度高的前缀比如g_一眼就能看出是全局变量在流程文档里明确写出哪些流程会改写这个全局变量流程参数子流程的接口流程参数是专门为子流程设计的。它跟局部变量不同的地方在于——流程参数是子流程的对外接口。定义方式打开子流程文件点击左侧流程参数标签添加输入参数入参和输出参数出参给每个参数起名、选类型、写说明输入参数主流程调用子流程时把数据传进来。输出参数子流程执行完后把结果传回主流程。主流程 main.flow local_orders [ORD001, ORD002, ORD003] 【运行子流程】process_orders.flow 输入映射local_orders → 入参 orders_input 输出映射出参 result → local_result 子流程 process_orders.flow 流程参数输入 orders_input列表类型← 主流程传进来的订单列表 处理逻辑 FOR EACH order IN orders_input: 处理订单... done_count 3 流程参数输出 result字符串类型 成功处理 done_count 条流程参数 vs 全局变量怎么选这是新手最纠结的问题。当主流程要给子流程传数据时走流程参数还是全局变量优先选流程参数。理由数据流向清晰能一眼看到主流程传了什么进去、子流程输出了什么子流程可复用同一个子流程可以被不同主流程调用每次传不同的参数就行不会污染全局空间参数只在调用期间有效不影响其他流程用全局变量的情况数据是全项目通用的配置不是某次调用的特定数据。比如数据库连接地址、API Key——这些每个流程都用而且是固定的走全局变量比每次传参更合理。三个实战翻车现场翻车1同名变量不会互相覆盖主流程里有个变量叫result子流程里也有个变量叫result。很多人以为子流程执行完会自动更新主流程的result。不会。这是两个完全独立的变量。子流程的值必须通过流程输出参数或全局变量传回来。# 错误期待主流程 result→ 运行子流程 → 期望 result 自动变成子流程的结果# 实际主流程 result 还是# 因为子流程那个 result 是个同名但不相关的变量翻车2全局变量在循环里被覆盖主流程 FOR EACH item IN data_list:【设置全局变量】g_current_itemitem 【运行子流程】process_item.flow# 期望子流程处理完当前的 itemEND FOR 子流程 process_item.flow 【读取全局变量】itemg_current_item 处理 item...# 耗时5秒# 问题如果子流程没执行完主流程的循环已经走到下一个item了# g_current_item 被覆盖子流程读到的是下一个item的值对于循环里需要传参的场景老老实实用流程参数每一轮调用的参数都是独立的副本。翻车3流程参数类型不匹配主流程传了一个数字count 5子流程的输入参数定义为字符串类型。影刀在某些版本会自动转换但有时不会——结果子流程里拿到的是5而不是5做数值运算时出奇怪的问题。建议主流程和子流程的参数类型保持一致。如果主流程是数字子流程的入参也定义成数字。不要依赖自动类型转换。选型速查表场景用什么原因循环计数器、中间结果局部变量不需要跨流程共享数据库连接信息全局变量全项目复用值不变主流程传数据给子流程流程参数数据流向清晰子流程返回结果给主流程流程参数输出调用方能拿到返回值紧急停止标志全局变量需要跨流程即时生效子流程内部的临时数据局部变量不需要暴露给外部一条核心原则能用局部变量就别用全局变量能用流程参数就别绕弯子。变量体系越简单出bug的几率越低。作者林焱