作者:Todd Weller

Cross I.T. 高级数据系统架构师

Todd Weller 是位于美国宾夕法尼亚州格林维尔的 FileMaker 商业联盟白金合作伙伴 Cross I.T. 的高级数据系统架构师。他为内部员工和客户开发了近 18 年的 FileMaker 解决方案。

Todd 拥有电气工程学位,在开始构建 FileMaker 解决方案之前,他曾担任 PLC 和驱动系统程序员和故障排除员。如果你找不到他,那么他八成可能在坐过山车。

Cross I.T. 专注于信息技术行业已经有 20 年。除了提供基于 FileMaker 平台构建的自定义业务解决方案的开发团队之外,Cross I.T. 还聘请了一个专家团队,提供网络基础设施、服务器和电话系统,以满足每个客户的独特需求。Cross I.T. 的博客中有来自两边团队的技术分享和专业提示。

对于任何 FileMaker 开发者或高级用户来说,编写脚本执行自动化进程是每周(甚至是是每天)都要进行的任务。在编写脚本的过程中,我们可以使用脚本参数从按钮、脚本触发器或其他脚本传递信息。这让我们可以利用脚本——或者说子脚本,我更愿意这么称呼它——来执行多项任务。因为需求的值没有硬编码到脚本中,而是利用脚本参数进行动态设置的。

当我写完第一段的时候,我意识到了我同时犯了一个技术错误和一个语法错误。从 FileMaker 7 开始,开发人员可以将一个脚本参数(单数)传递给脚本。如果您查看按钮设置对话框或者“执行脚本”脚本步骤,您会看到一个名为“脚本参数”的选项。相应地,用来接收这一信息的函数是 Get (脚本参数)。然而,所有 FileMaker 开发人员都在谈论使用脚本参数(复数)。这是为什么?

译者注:上一段中第一个脚本参数为 script parameter,第二个脚本参数为 script parameters。前者使用了单数名词,后者使用了复数名词。即作者的意思是在 FileMaker 早期版本中开发人员仅将一个脚本参数传递给脚本,而现在则会传递多个脚本参数。

原因很简单,我们已经找到了很多种方法可以在调用脚本时将多个值保存在一行文本中,之后在脚本执行时解析出这些值。在本文中我将分享过去 15 年来我在编写脚本时使用的各种方法及其演变过程。和大多数方法一样,这些方法都有各自的优点和缺点。

最初,得知我们需要在文本字符串中使用一个不太常见的分隔符,我决定使用“|”符号。然后在 PatternCount ()、Left ()、Middle () 和 Right () 函数的帮助下,我解析了数据并在脚本中设置了所需的本地变量。

如果我们希望脚本接收三个值——或者说“参数”,我们通常这么称呼它——则无论脚本如何被调用,参数会以如下方式输入:

“字符串1” & “|” & “字符串2” & “|” & “数值1”

这个非常简单的计算公式生成了如下所示的脚本参数:

字符串1|字符串2|数值1

在您做出任何评论之前,我意识到我完全可以将上面的结果直接输入为计算公式。但是我发现像我这样写更容易确定计算公式的哪些部分是参数,因为分隔符与值是分开定义的且并不会被视为连续的字符串。(这就是我强迫症的后果。)

译者注:这里作者开了一个玩笑,将强迫症(OCD)故意写作 CDO,因为后者是按照字母顺序排列的,来表示自己是深度强迫症患者 ?

我使用了一系列设置变量脚本步骤从脚本中解析值。三个变量的计算公式分别如下所示。(请注意,为了节约空间,我将 Get ( 脚本参数 ) 函数替换为了“GSP”。):

Left ( GSP ; Position ( GSP ; "|" ; 1 ; 1 ) - 1 )

Middle ( GSP ; Position ( GSP ; "|" ; 1 ; 1 ) + 1 ; Position ( GSP ; "|" ; 1 ; 2 ) - Position ( GSP ; "|" ; 1 ; 1 ) - 1 )

Right ( GSP ; Length ( GSP ) - Position ( GSP ; "|" ; 1 ; 2 ) )

这个示例的优点是系统可以轻松处理空值或无效值。缺点是向参数添加第四个值时需要一些额外的编程工作。在传递参数的时候添加第四个值很容易,工作真正开始是修改脚本来解析这个新值。Middle () 函数必须保留在中间,Right () 函数必须用于最后一个值。因此在我的修改过程中,我复制了倒数第二个“设置变量”步骤,并根据需要更改变量名称和/或函数的参数。当然,这不是一项艰巨的任务,但很容易忘记回头更新 Middle () 和 Position () 函数的“开始处”和/或“序数”值。

译者注:

Middle () 函数的完整表达式为:Middle (文本; 开始处; 字符个数)

Position () 函数的完整表达式为:Position (文本; 查找的字符串; 开始点; 序数)

下一代更新继续使用了值分隔符,但我切换为使用回车符(“¶”符号)。虽然可以简单地使用“¶”替换第一个示例中的“|”,但是通过使用 List () 函数可以进一步简化脚本参数的计算,这也提高了可读性。传递给脚本的参数设置为:

List (

“字符串1” ;

“字符串2” ;

“数值1”

)

这个计算公式返回了如下所示的脚本参数:

字符串1

字符串2

数值1

为了在脚本中解析值,我再次使用了一系列的设置变量脚本步骤。但我只需要在计算公式中使用 GetValue () 函数。现在,相同步骤的计算结果如下所示:

GetValue ( Get ( 脚本参数 ) ; 1 )

GetValue ( Get ( 脚本参数 ) ; 2 )

GetValue ( Get ( 脚本参数 ) ; 3 )

这个方法的优点是显而易见的。无论是编程还是故障排除的过程中,参数都更加易于阅读,并且解析每个值的时候只需要一个函数即可。另外,增加一个新值也可以很简单地通过更改脚本来完成。缺点主要集中在参数的计算上,特别是在使用 List () 函数的时候。它会忽略空值,这会导致返回的以回车分隔的列表“向上缩进”。如果脚本包含三个值但是第二个值为空,则第三个值会变成第二个值。这会在执行脚本时导致意外结果。这个方法也不是无法处理空值或无效值,但是在计算参数和解析值的时候都需要一些额外的编程工作。

虽然在开发者大会上和 FileMaker 社区中已经有很多人分享了其他的方法,在和本文类似的其他博客中也有所提及,但我仍然在很多年的时间里使用我这种方法。首先它很容易理解。其次,虽然这些新的技术解决了上述缺点,但是它需要使用自定义函数来计算参数和解析值。鉴于缺点只是一个很小的时间问题,我决定坚持使用容易理解的方法。

然后就进入了 JSON 时代。随着 FileMaker 16 的发布,我们获得了六个原生函数来处理 JSON。我花了一些时间来完全理解 JSON 语法,并掌握了这些新函数在我的 FileMaker 解决方案中所有的潜在应用。JSON 的核心是一系列名称/值的组合,我意识到这个特点可以用来向脚本传递信息,然后在脚本开始执行时解析出值。我的脚本参数计算公式现在如下所示:

Let ( [

json = JSONSetElement ( json ; “值1” ; “字符串1” ; JSONString ) ;

json = JSONSetElement ( json ; “值2” ; “字符串2” ; JSONString ) ;

json = JSONSetElement ( json ; “值3” ; “数值1” ; JSONNumber )

] ;

JSONFormatElements ( json )

)

脚本接收到的参数为:

{

“值1” ; “字符串1”,

“值2” ; “字符串2”,

“值3” ; “数值1”

}

虽然它初看起来确实比其他方法更复杂,但是随着人们对 JSONSetElement () 函数的熟悉,它变得很容易理解。此外,由于“参数”的名称现在与传递给脚本的值一起出现,因此混淆和错误的风险会降低很多。空值、占用多行或由特殊字符构成的值会由脚本参数中的 JSON 函数自动处理。(请注意,传递脚本参数并不需要使用 JSONFormatElements () 函数。添加它是为了调整 JSON 对象中元素的格式,并且在使用数据查看器调试脚本时更易于阅读。)

当使用 JSONGetElement () 函数从脚本参数中检索值时,设置变量步骤的计算公式为:

JSONGetElement ( Get ( 脚本参数 ) ; “值1” )

JSONGetElement ( Get ( 脚本参数 ) ; “值2” )

JSONGetElement ( Get ( 脚本参数 ) ; “值3” )

同样,计算公式最初看起来可能很吓人,但是随着人们对 JSON 函数的熟悉,任何担心都将会消失。

就像在我开始使用回车分隔列表版本的脚本参数时一样,我感觉我已经找到了可以使用很长一段时间的方法。然而最终的更新在我切换到 JSONSetElement () / JSONGetElement () 技术后不久就发生了。因为我意识到了在了解 JSON 对象中包含的每个元素的名称和值之后我可以做什么。

当传递给脚本的值从脚本参数中解析出来时,可以使用单个脚本步骤声明所有本地脚本变量。第一个好处是脚本的可移植性。现在我可以将一个设置变量脚本步骤复制并粘贴到脚本中,而不必使用对应的值声明每个变量。无论脚本参数包含一个还是七个值,相同的脚本步骤都可以提取所有的值。第二个好处是在更改脚本时发现的。如果在声明脚本参数的过程中引入了另外一个元素,则脚本会自动解析这个值,而不必单独声明这个本地变量。我仍然需要编辑按钮或“执行脚本”步骤来调用我的脚本,但我可以开始在脚本中使用这些新信息了。

目前,FileMaker, Inc. 已经提供了实现这一目标的工具。首先 JSONListKeys () 函数可以只提取给定 JSON 对象中包含元素的键或名称。其次 Let () 函数可以声明本地脚本变量(或是“$”变量),而不必使用“设置变量”脚本步骤。最后 Evaluate () 函数让我们可以动态编写计算公式。

这三个函数可以用来处理单个值,因此最后一步是将它们整合为一个自定义函数。如前所述,我想避免使用自定义函数,因为我需要将它添加到每个希望使用这种新的解析脚本参数方法的文件中。但是我可以重复调用这个自定义函数来使用递归,这样就能够在一个步骤中解析出所有的值。此外,我只需要添加一个自定义函数就可以提取值,而不用为计算和解析分别添加多个函数了。

我创建的自定义函数为 fnExtractParameter (json ; index)。其中“fnExtractParameter”是我给自定义函数起的名称。第一个函数参数“json”是预期的 JSON 对象,“index”是函数开始解析值时的起始元素。整个自定义函数如下所示:

Let ( [

keyList = JSONListKeys ( json ; "" ) ;

keyCount = ValueCount ( keyList ) ;

key = GetValue ( keyList ; index ) ;

value = JSONGetElement ( json ; key )

] ;

Evaluate ( "Let ( [ $" & key & " = " & Quote ( value ) & " ] ; 1 )" )

+

If ( index < keyCount ; fnExtractParameter ( json ; index + 1 ) ; "" )

)

除了声明脚本参数中包含的本地脚本变量之外,这个函数还返回了在执行过程中声明的变量总数。这个结果不是必需的,但是我无法创建一个没有返回结果的函数。这与 FileMaker 平台任何的限制都无关。只是因为我之前提到的强迫症,所以我没法这么做。

现在我的工具箱中添加了新的工具,这个使用单个“设置变量”脚本步骤的计算公式如下所示:

fnExtractParameter ( Get ( 脚本参数 ) ; 1 )

当查看“设置变量”脚本步骤时,我发现没有办法再简化它了。每个值都可以从 JSON 对象的脚本参数中提取,并且声明的变量和 JSON 对象中包含的“键”或“名称”匹配。当然,在背后还有很多内容,但是现在脚本更加易于阅读,并且整体上也很容易理解。同时这种方法很方便移植,可以在同一文件甚至不同文件的脚本之间重复使用。

如果说一张图片胜过千言万语的话,那么一个演示文档更应如此。为了帮助您理解,我在本文中附上了一个演示文档,其中包含上述三种方法的简单示例。我知道我写的比预想的要多,感谢您能坚持读完。我相信这些信息可以帮助您进行脚本编写,就像它帮助过我一样。

下回见。

点击“阅读原文”即可查看并下载样例文件。


wlansetprofile 倒数第二个参数_西部世界 | 脚本参数的演变相关推荐

  1. 贝叶斯优化神经网络参数_贝叶斯超参数优化:神经网络,TensorFlow,相预测示例

    贝叶斯优化神经网络参数 The purpose of this work is to optimize the neural network model hyper-parameters to est ...

  2. gridsearchcv参数_随机森林算法参数解释及调优

    本文将详细解释随机森林类的参数含义,并基于该类讲解参数择优的过程. 随机森林类库包含了RandomForestClassifer类,回归类是RandomForestRegressor类.RF的变种Ex ...

  3. js数组再倒数第二个添加元素_归纳JS中数组的使用(一)元素新增和删除

    新增元素 js中给数组新增元素主要通过2个方法 push 和 unshift Array.prototype.push 功能概述 push() 方法将一个或多个元素添加到数组的末尾,并返回该数组的新长 ...

  4. js数组再倒数第二个添加元素_【JS】JS数组添加元素的三种方法

    正文 1.push() 方法可向数组的末尾添加一个或多个元素,并返回新的长度. 1).语法: arrayObject.push(newelement1,newelement2,....,newelem ...

  5. python中forward的参数_如何将关键字参数传递给preforward钩子使用的forward?

    Torchscript不兼容(截至1.2.0) 首先,您的示例torch.nn.Module有一些小错误(可能是意外造成的).在 第二,您可以将任何传递给forward,register_forwar ...

  6. c代码中 执行sh文件 带参数_创建含有$1参数的Bash脚本以及运行脚本的三种方法...

    一.先创建一个简易脚本 要求: 1.创建一个名为demo.sh的文件,如果该脚本后跟上文件名某某某,就会产生一个名为某某的文件夹 2.某某某文件内要有一个index.html及文件夹css和文件夹js ...

  7. 后面的参数_常用的JVM参数,你现在就记好

    作者:SimpleSmile_5177 来源:https://www.cnblogs.com/Simple-Object/p/10272326.html 前言 大家都知道,jvm在启动的时候,会执行默 ...

  8. powerbi如何创建参数_创建PowerBI「参数」轻松搞定动态分析

    静态的分析经常不能满足实际分析的需要,还需要引入动态分析,通过调节某个维度的增减变化来观察对分析结果的影响.在PowerBI中,可以使用「参数」,以切片器的形式来控制变量,与其他指标进行交互,进而完成 ...

  9. 发那科2021参数_发那科参数(详细)讲述.doc

    发那科参数(详细)讲述 四轴参数说明 N0000 (#2=0公制输入单位,=1为英制,这里只设公英制输入单位,机床公英制由1001#0决定: #1=1输出ISO代码,=0为EIA代码) N0001 P ...

最新文章

  1. Python 包管理工具解惑
  2. 混沌分形之逻辑斯蒂(Logistic)映射系统
  3. 盘点2010年十大出版事件 文著协“宣战”百度文库
  4. 人生没有对与错,只是选择不同
  5. STM8S——8位基本定时器(TIM4)
  6. 【Python】line.strip().split(‘,‘)含义
  7. creating server tcp listening socket 127.0.0.1:6379: bind No error
  8. 连续数字及数字串识别技术
  9. Codeforces1005E1 - Median on Segments (Permutations Edition)(中位数计数)
  10. uml 9图不同的角度品种分类
  11. 使用bat一键修改ip地址(包括静态、动态ip)
  12. 干货!情感计算理论基础必看知识!!
  13. 数学建模系列-预测模型(五)---马尔可夫链
  14. 2022新版彩虹易支付系统源码支持当面付通道轮询第三方支付免签约
  15. G.652与G.655单模光纤分类及对比
  16. python 学习2
  17. 物联网通信消息队列客户端-MQTT简介
  18. java项目前有红色叉号_eclipse导入项目后出现红色叉号的解决方案
  19. MPU6050原始数据分析——学习笔记
  20. 2022P气瓶充装判断题及在线模拟考试

热门文章

  1. bmp、jpg、gif、png格式
  2. android 6.0 内核版本,ZUI 1.6版发布 内核居然是Android 6.0.1
  3. weblogic10.3.6补丁安装及卸载Centos7.6
  4. 实战浪潮英信服务器web部署操作过程(3)
  5. iptables转发mysql_CentOS系统中使用iptables设置端口转发
  6. java分组校验_SpringBoot @Validated注解实现参数分组校验的方法实例
  7. oracle用户认证机制包括,oracle的认证机制
  8. Centos中开机执行.sh文件
  9. 微信小程序 实现在底图上绘制扇形
  10. 教父三部曲nbsp;影评