企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持知识库和私有化部署方案 广告
# 变量 DOpus 中的脚本都是一次性的, 脚本的全局变量并不会被保持,每次调用时脚本都会被重新初始化。如果想要在两次调用之间保持值,就需要使用 DOpus 提供的变量([Var](https://www.gpsoft.com.au/help/opus12/index.html#!Documents/Scripting/Var.htm))。 ## 作用域 DOpus 的变量有以下几种作用域: 作用域 | 访问途径 | 持久存储 --- | --- | --- 全局 | <code>[DOpus](https://www.gpsoft.com.au/help/opus12/Documents/Scripting/DOpus.htm).vars</code> 文件窗口 | <code>[Lister](https://www.gpsoft.com.au/help/opus12/Documents/Scripting/Lister.htm).vars</code> | 可存储在文件窗口布局中 文件夹标签 | <code>[Tab](https://www.gpsoft.com.au/help/opus12/Documents/Scripting/Tab.htm).vars</code> | 可存储在文件窗口布局中 脚本 | <code>[Script](https://www.gpsoft.com.au/help/opus12/Documents/Scripting/Script.htm).vars</code> <br /> <code>[ScriptInitData](https://www.gpsoft.com.au/help/opus12/Documents/Scripting/ScriptInitData.htm).vars</code> 对话框 | <code>[Dialog](https://www.gpsoft.com.au/help/opus12/Documents/Scripting/Dialog.htm).Vars</code> 命令 | <code>[Command](https://www.gpsoft.com.au/help/opus12/Documents/Scripting/Command.htm).vars</code> | 不可持久存储;不会影响调用者的变量 持久存储的变量可以在重启 DOpus 后恢复原来的值,但只支持以下几个类型: - `bool` 和 `int` - `string` - `date` - `currency` - `Vector`(只能使用以上类型的元素) ## 变量操作 - 检测变量是否存在:`Vars.Exists("name")` - 获取变量:`Vars.Get("name")` - 设置变量:`Vars.Set("name", "value")` - 删除变量:`Vars.Delete("name")` ## 值类型 尽管 DOpus 的文档中说变量可以存储任意类型的值,但至少在 JScript 中实际情况并非如此[^var-type],既不支持数组也不支持对象: ```js var test1 = [1, 2, 3]; var test2 = { a: 1 }; DOpus.vars.Set("test1", test1); DOpus.vars.Set("test2", test2); ``` ```js // 'DOpus.vars.Get(...).0' 为 null 或不是对象 (0x800a138f) DOpus.Output(DOpus.vars.Get("test1")[0]); // 'DOpus.vars.Get(...).a' 为 null 或不是对象 (0x800a138f) DOpus.Output(DOpus.vars.Get("test2").a); ``` 如果你必须要使用复杂类型,可以使用 `JSON.stringify()` 将值序列化后保存到变量,再使用 `JSON.parse()` 来反序列化,得到原值。[^json] ## 变量枚举 JScript: ```js DOpus.Output(DOpus.vars.count); for (var e = new Enumerator(DOpus.vars); !e.atEnd(); e.moveNext()) { DOpus.Output(e.item().name + ": " + e.item().value); } ``` vars 是 Collection,不能通过下标访问元素(尽管[文档中错误地说可以这样做](https://resource.dopus.com/t/global-variables-in-jscript/20176/6));也不能使用 forEach。 VBScript: ```vbs For Each Var in DOpus.Vars DOpus.Output(Var & ": " & Var.value) Next ``` 你可以通过 [Global Variable Management Dialog](https://resource.dopus.com/t/global-variable-management-dialog/26402) 来查看和管理全局变量: ![](https://resource.dopus.com/uploads/default/original/3X/1/b/1bfe87affba61c58ee3642a5f441e33ca923c1b3.jpg) [^var-type]: [Issue with Var: Object turns into Unknown - Help & Support - Directory Opus Resource Centre](https://resource.dopus.com/t/issue-with-var-object-turns-into-unknown/30063) [^json]: [Multiline or JSON ScriptConfig type - Help & Support - Directory Opus Resource Centre](https://resource.dopus.com/t/multiline-or-json-scriptconfig-type/18755/17)