FWScript 函数

函数是专门定义的用来调用的,FWScript函数分为:
内置函数,由Bizrunner程序内部编写的内部函数库,可以在脚本中直接调用;
自定义函数,可以是使用FWScript脚本实现的一个程序体,称为自定义函数。
外部DLL函数,可以是DLL文件提供的函数接口,称为外部DLL函数;

  • 内置函数
  • 自定义函数
  • 外部DLL函数
  • DLLInside函数
  • 函数比较

外部函数分为自定义外部函数与DLL函数,在调用前必须在系统中进行登记,自定义外部函数登记时会记录函数所属的类名与外部函数库文件的关系,在执行过程中,如果发现系统没有调入该函数库文件,则动态调入到系统中;DLL函数登记时系统会自动记录好函数类名与DLL的对应关系,当调用这个函数时,若该DLL没有调入,则动态调入。 函数的调用必须按照定义时的参数说明进行调用,否则在执行的时候会出现报错;命令行的函数调用其返回值均放置在变量$$中。


命令行调用与表达式内调用

	FWScript 提供两种函数调用方式,其实现方式在内部有所区别。
	命令行调用:
		在一个命令行中只有这个函数调用,调用后的结果放到$$中。
		这种调用方式下,可以使用表达式作为函数的参数,如下所示:
		File.AppendAllText($dir+'\'+$filename, "the content is " + $content)
		show  "the result is " + $$ 
		
	表达式内调用:
		在一个表达式内部,作为一个值单元进行调用,调用后的结果直接"递送到"表达式的计算中。
		这种调用方式下,参数只可以使用简单的单个元素的变量或者常量,如:$v, "yes", true, 1.23等等。
		如下所示:
		$str = "The result of comparing is " + $s1.Equals("abc") + "."
	
	注意,FWL函数只能使用命令行调用方式;其它函数则两种调用方式都可以。
	

内置函数

内置函数为系统自带的由BizRunner自身实现的函数库,无需登记。

 调用: function(arg1,arg2,arg3)
 可以作为一条指令调用,其结果放到变量$$中,如: S3Auto(30)
 也可以放在表达式中, 如:$str = "the temperature of CPU is " + GetCPUT()

除内置函数没有类名之外,其它的约定与外部自定义函数一样,如返回值放在变量$$中。
参见 内置函数列表

外部自定义函数FWL

fwl格式文件为在BizRunner开发平台上专门为函数库保存的一种文件格式,由开发者编写相应的脚本,由此开发者可以将一些通用的功能编写成FWL函数,然后再由其它的脚本调用。
FWL函数在使用前必须先登记。


FWL函数登记

FWL函数的登记可以使用多种方式:
import c:\bizat\txt\testfwl.fws		:使用fws源文件进行登记,登记时调入内存,扫描一遍源代码,转换成FWL格式
import c:\bizat\txt\testfwl.fwl 	:使用fwl文件登记,登记时调入脚本
import c:\bizat\txt\libs.json 		:使用json文件登记,登记时不调入脚本,有调用的时候再调入,详见下面的描述

注意:如果直接使用fwl或FWS文件进行登记,BizRunner将调入对应的库文件,然后将函数登记到系统中,在这种登记方式下,BizRunner会将该文件的所有脚本内容“顺便”调入到系统中(亦即“Load”进来了)。
import 可用 register、require 代替,也可使用符号 ^<
Json文件格式

List<string[ ]> [{“FWL”, “filePath”,”Description”}, {“NameSpace”, “className1”, “className2”, ... ... }]
Json文件中记录有该函数库对应的函数文件以及所包含的所有类名。使用这种方式,BizRunner仅仅登记这些类名,当真正调用时,如果是首次调用,则将对应的函数体Load进来。

针对自定义外部函数的Json说明文件,第一个字符串必须为"FWL",例如:

List<string[]>
[
 ["FWL",  "c:\\bizat\\txt\\fwl.fws",  "any description of the funwin lib"],
 [“NameSpace”, "class1"],
 ... ... 
]
注意:filePath如果不是完整的路径,则解释如下:\开头意味着使用BizRunner的安装目录;不是\开头则意味着与脚本文件使用同一个目录

外部自定义函数的调用不能放到表达式中

FWLib函数定义

FWScript可以定义自己的函数,通常将定义的函数放在一个单独的文件中,称为FWLib文件,其它脚本程序可以调入这个文件,然后调用里面定义的方法。
每个FWLib文件中必须指定该库文件的类名:
class(^^) classname

一个函数的定义分成如下几个部分:
函数头:
	function(^) funcName(arg1,arg2)  : 调用的时候,系统会将实际调用的参数放到$arg1, $arg2中,实际参数多了则忽略,少了则不赋值。
	或
	function(^) funcName  :如果后面没有指定参数,则在执行的时候,会将实际调用的参数总数放到$0中,参数依次放到 $1 .. $9
	
函数的说明:
	fcomment(^/) xxxxxx  
函数执行体
	fbegin(^{) 函数开始
		... ...
	fend(^})   函数结束
执行返回
	return(^|)  expr
	
注意:目前BizRunner仅仅实现在一个FWL文件中只能指定一个className
注意:class可以使用^^代替;function可以使用^代替, fbegin 可用 functionbegin或^{ 代替,fend 可用 functionend或 ^} 代替, FParameter可用 ^( 代替,return可以用^|代替

注意:

  1. 尽管支持在任意脚本中定义函数,但强烈建议将函数定义归入单独的代码文件中,然后转换成FWL文件,供其它脚本进行调用
  2. 在函数文件中可以进一步"引入"函数库(登记函数库),也就是说,在FWL的函数文件中,也可以使用 ^<filename 或 import filename

FWLib函数调用方法


classname.methodName(param1,param2,param3)
只能作为一条指令调用,其结果放到变量$$中。

.methodName(arg1,arg2,arg3)
这种调用方式(以.开头)意味着使用这个指令所在文件的classname:
	如果是在非FWLib文件中,则直接调用这个脚本文件中定义的方法,就像JavaScript一样,必须先定义,再调用。
	如果是在FWLib文件中,则使用这个文件定义的ClassName。(注意:每个FWLib文件必须要指定其ClassName)

function为methodname,括号中的实参会自动转化到被调用脚本中,依据定义的规则放到不同的变量中。

外部DLL函数

外部DLL函数指的是直接使用微软定义的DLL文件,通过对DLL文件的访问,获得该DLL文件所包含的函数,然后直接进行调用。
如果有些功能比较复杂,需要使用像C#这类的语言去实现,则可以利用外部DLL的方式来实现。

函数登记

BizRunner可以通过直接指定DLL文件来进行登记,从而获取相应的DLL所有函数的接口,登记到系统中,在这种登记方式下,BizRunner同时会将该DLL调入到系统中(亦即"Load"进来了),而且会将DLL中所有的函数都登记进来。因为登记时会将所有的函数接口登记到系统中,影响系统性能,因此不推荐使用该方式,特别是较大的第三方DLL,建议使用Json格式的文件。

import c:\bizat\lib\DllUserCode.dll 	:使用dll文件登记,登记时将该DLL的所有函数加入列表中
import c:\bizat\txt\libs.json 		:使用json文件登记,登记时只需将指定的函数加入到列表中
Json文件格式

List<string[ ]> [{"DLL", "ClassName","NameSpace"}, {"funcion1", "function2", ... ... }]
Json文件中记录有该函数库对应的函数文件以及所包含的所有函数。使用这种方式,BizRunner仅仅登记这些函数,当真正调用时,如果是首次调用,则将对应的函数体Load进来。

针对DLL函数的Json说明文件,第一个字符串必须为DLL,例如:

List<string[]>
[
 ["DLL",  "c:\\bizat\\lib\\thelib.dll",  "description"],
 ["NameSpace1", "class1", "class2", "class3"],
 ["NameSpace2", "class3", "class4", "class5"],
 ... ... 
]
注意:在FWScript中没有使用NameSpace,因此上述定义中每个class的名字必须不一样。

DLL函数调用

classname.methodName(param1,param2,param3)
可以作为一条指令调用,其结果放到变量$$中,这种方式下,所有参数可以为表达式;

也可以放在表达式中,结果作为表达式中的一个值,这种方式下,所有参数必须为一个值或变量。
如:$str = "it is " + MyClass.MyFunc("p1",$a)

function为classname.methodname,实参与DLL中函数定义的参数对应,否则执行时会出错。

DLLInside函数

为了充分利用C#自身的一些函数,特别是针对字符串与文件的处理函数,FWScript定义了一种新的函数模式DLLInside。 DLLInside可实现将C#的一些类的函数,直接在FWScript中使用。
可支持两种调用的方式:静态函数方式与对象函数方式。

可支持的类:
	String
	File:仅静态方式
	Bson
	BsonArray
	AutomationElement:仅动态方式
调用方式:(命令行/表达式内:同上面所描述的)(静态方式/对象方式)
	静态方式:  
			举例: File.AppendAllText('c:\tmp\t.txt', "the line to append \n")
					String.Equals($str, "abc")
	对象方式:
			举例: $Str.Equals("abc")
					$b.Add("name",$value)					
						
注意:调用时,类名大小写无关,但函数名必须注意大小写。
为了在DLLInside的调用中使用特殊的参数,FWScript定义了如下的关键字:
  "utf8" = Encoding.UTF8
  "ascii" = Encoding.ASCII
  "withcase" = StringComparison.Ordinal
  "withcaser" = StringComparer.Ordinal
  "caseignore" = StringComparison.OrdinalIgnoreCase
  "caseignorer" = StringComparer.OrdinalIgnoreCase
  
 例如,需要不区分大小写比较字符串的话,可使用调用
 $result = $str.Equals("abc", caseignore)
 

函数比较

函数函数登记函数调用编程语言
内置函数不需要 函数名()BizRunner内嵌
外部FWL函数fws / fwl / json文件类名.函数名() 或者 .函数名();不能放在表达式中FWScript
外部DLL函数dll / json文件类名.函数名()任何语言
DLLInside函数不需要类名.函数名()C#内嵌
<< FWScript 多媒体支持FWScript 函数 >>