您好,欢迎来到小侦探旅游网。
搜索
您的当前位置:首页OPS_使用简易教程详解

OPS_使用简易教程详解

来源:小侦探旅游网
OPS使用详解

1. OPS概述 .................................................................................................................................. 3 2. OPS操作介绍 .......................................................................................................................... 3

2.1. 启动OPS .................................................................................................................. 3 2.2. 编辑模式 ................................................................................................................... 4 2.3. 运行模式 ................................................................................................................... 5 2.4. 输出模式 ................................................................................................................... 6 2.5. OPS窗口介绍 .......................................................................................................... 7

2.5.1. 标题栏 ............................................................................................................... 7 2.5.2. 工具栏 ............................................................................................................... 8 2.5.3. 网元栏 ............................................................................................................... 8 2.5.4. 模式选择栏 ....................................................................................................... 8 2.5.5. 状态栏 ............................................................................................................... 9 2.5.6. File菜单 ........................................................................................................... 9 2.5.7. Edit菜单 ......................................................................................................... 11 2.5.8. View菜单 ....................................................................................................... 13 2.5.9. Debug菜单 ..................................................................................................... 18 2.6. 使用样例 ................................................................................................................. 20

2.6.1. 创建一个OPS脚本语言程序并执行 ............................................................ 20 2.6.2. 打开已有的OPS脚本语言程序并执行 ........................................................ 23 2.6.3. 调试有错的OPS脚本语言程序 .................................................................... 24 2.6.4. 运行OPS脚本语言程序的部分语句 ............................................................ 26

3. OPS脚本语言介绍 ................................................................................................................ 28

3.1. OPS脚本语言程序的组成 .................................................................................... 28 3.2. OPS脚本命令和函数 ............................................................................................ 28

3.2.1. 错误处理 ......................................................................................................... 29 3.2.2. 流程控制 ......................................................................................................... 30 3.2.3. 外部系统通信 ................................................................................................. 30 3.2.4. 文件和打印机记录 ......................................................................................... 31 3.2.5. 时间相关 ......................................................................................................... 32 3.2.6. 用户输入输出 ................................................................................................. 32 3.2.7. 文件系统 ......................................................................................................... 32 3.2.8. 字符串及数字处理 ......................................................................................... 33 3.2.9. 进度报告 ......................................................................................................... 33 3.2.10. 杂项 ................................................................................................................. 34 3.2.11. FIOL命令 ....................................................................................................... 34 3.3. MML命令、注释、脚本命令和函数 .................................................................. 35 3.4. 变量 ......................................................................................................................... 36 3.5. 变量替换 ................................................................................................................. 37 3.6. 模拟数组 ................................................................................................................. 39 3.7. 字符串 ..................................................................................................................... 39

1

3.8. 操作符 ..................................................................................................................... 40 3.9. 错误处理 ................................................................................................................. 41 4. OPS程序实例分析 ................................................................................................................ 42

4.1. 在多个网元里面执行相同的指令 ......................................................................... 42 4.2. 做LOGFILE ........................................................................................................... 42 4.3. RESPONSE分析与写文件 .................................................................................... 43 4.4. 读文件 ..................................................................................................................... 46

2

摘要:本文对OPS的使用进行了详细介绍,以供大家参考。 关键词:OPS OPS脚本语言程序 模式 运行

在日常工作中我有时会用到OPS,在使用OPS的过程中,我发现OPS是一个很好的工具,通过简单编程,便可以使很多日常工作实现自动化,极大地提高了工作效率,所以我在参考OPS介绍文档的基础上,结合自己的一些经验,撰写本文,以帮助对OPS不熟悉的同事快速入门,享受OPS带来的好处。

1. OPS概述

OPS(Operations Procedure Support)是爱立信提供的一个软件,主要用于编写、调试、运行OPS脚本语言程序。

OPS窗口有三种模式:编辑模式(EDIT MODE)、运行模式(RUN MODE)和输出模式(OUTPUT MODE)。在编辑模式模式下,我们可以编辑OPS脚本语言程序。运行模式主要用于调试、运行OPS脚本语言程序。而输出模式则用于浏览OPS脚本语言程序运行时产生的输出。

如果OPS脚本语言程序运行出错,错误信息可能出现在程序运行输出区,也可能弹出窗口提示,或者在状态栏显示。

2. OPS操作介绍

2.1. 启动OPS

我们可以通过在OSS工作站桌面右键弹出的快捷菜单启动OPS,或者通过命令行终端输入命令“ops_gui”来启动OPS。

如果用命令行方式启动OPS,我们可以根据需要使用“ops_gui”的参数。“ops_gui”的参数如下所示:

ops_gui [-mail user1 [,user2 ... ,userN ]] [-file f] [-es n ] [-mode m ] [-startlabe l ] [-autoquit] [-routefile file ] [-routemail user ] [-routeprinter

printer ] [-D varname=varvalue ]-user -pwd

下面解释一些参数的含义:

-mail user1 [,user2 ... ,userN]:指定获得程序运行结果的用户,运行结果以邮件

3

的形式通知用户。

-file f: 指定OPS启动时要装载的OPS脚本语言程序。 -es n: 指定OPS启动时要连接的网元。

-mode m: 指定OPS启动后进入的模式,m可以为以下值:

“edit”:OPS启动后进入编辑模式(当本参数未指定时,OPS使用“edit”

作为默认值。)

“debug”:OPS启动后进入运行模式

“run”:OPS启动后进入运行模式并执行OPS脚本语言程序

2.2. 编辑模式

进行编辑模式后的OPS如图一所示:

在编辑模式下,我们可以对OPS脚本语言程序进行编辑。

图一 进行编辑模式后的OPS

4

2.3. 运行模式

在编辑模式下,单击“Run Mode”标签即可以进入运行模式,如图二所示。 从图中我们可以看到OPS窗口主要分为两部分。

上面白色的部分为代码区,主要是用来显示OPS脚本语言程序代码。下面灰色部分为输出区,主要用来显示程序执行过程产生的输出。

代码区左边被分为三列来表示行状态,分别用来表示断点(breakpoint)、标记行(tagged lines)和当前执行位置。

如果我们在最左列看到

符号,那么该行被表示为断点,当程序执行该行时,会自动

停下来。这个功能在调试中很有用,如果我们怀疑程序在某行附近出错,可以把该行标识为断点,使程序在这里停止执行,然后我们可以进行查错等工作。

在第二列我们可能看到符号,这是标记行标识。OPS有个功能可以只执行标记行,有时候会用到。

第三列出现的是

符号,表示程序当前执行位置,而且只有一行具有这个符号。而在

前面两列,可能有多行具有相同符号,也就是说可能有多个断点和标记行。 注意:如果总是更新位置功能在“Option”菜单中没有打开,那么在程序执行过程中

号不会随着执行位置的变化而变化。所以推荐大家在“Option”菜单中把更新位置功能打开。

5

图二 进行运行模式后的OPS

2.4. 输出模式

启动OPS后,单击“Output Mode”标签即可以进入输出模式,如图三表示。 输出模式主要用于浏览OPS脚本语言程序运行时产生的输出。

6

图三 进行输出模式后的OPS

2.5. OPS窗口介绍

2.5.1.

标题栏

OPS的标题栏如图四所示,从标题栏我们可以看到以下信息: 264:OPS会话号,由系统分配。 OPS:OPS软件名

Untitled-6:OPS打开的文件名

Not connected:与外部网元的连接情况(未连接)

图四 标题栏

7

2.5.2. 工具栏

OPS的工具栏如图五所示。

工具栏上的按钮从左到右依次为:新建文件(New File)、打开文件(Open File)、保存文件(Save File)、关闭文件(Close File)、打印文件(Print File)、剪切(Cut)、复制(Copy)、粘贴(Paste)、取消(Undo)、重做(Redo)、查找/替换(Find/Change)、 选择所有(Select All)、执行程序(Run file)、执行标记行(Run Tagged Lines)、从当前位置开始执行(Run From Current Position)、单步执行(Step)、停止执行(Stop)、复位运行时数据(Reset run time data)、变量查看窗口(Variable Watch Window)、 手动命令输入窗口(Manual Command Entry Window)

这些按钮都有相应的菜单对应,后面将结合菜单介绍他们的具体功能。 在不同的模式中,会出现一些按钮可用,一些按钮不可用,这是正常的。

图五 工具栏

2.5.3. 网元栏

OPS的网元栏如图六所示。

网元栏主要用于选择并连接外部网元。我们可以直接输入网元名称或者从下拉菜单中选择网元,然后单击连接按钮与外部网元相连。在已连接的情况下,可以单击断开连接按钮以断口OPS与外部网元的连接。

图六 网元栏

2.5.4. 模式选择栏

OPS的模式选择栏如图七所示。

如前面所说,单击栏上的模式标签就可以在不同的模式间切换。

8

图七 模式选择栏

2.5.5. 状态栏

OPS的状态栏如图八所示。

我们可以看到,状态栏被分隔成几个区域,从左到右依次用于:  显示程序执行的状态  显示当前行号  显示程序的总行数

 后面三个区域很少用到,这里不作介绍

图八 状态栏

2.5.6. File菜单

OPS的File菜单如图九所示。

图九 File菜单

9

New

新建一个文件 Open

打开已有的OPS脚本语言程序。选择该菜单后,出现如图十所示的“Open file”对话框帮助我们找到并打开已有的OPS脚本语言程序。

图十 “Open file”对话框

Save

保存正在编辑的OPS脚本语言程序。 Check Syntax Save

检查语法并保存。如果正在编辑的OPS脚本语言程序存在语法错误,OPS将弹出对话框提示。

Save As...

另存为。把正在编辑的OPS脚本语言程序保存为另一个文件。 Check Syntax Save As...

检查语法并另存为。如果正在编辑的OPS脚本语言程序存在语法错误,OPS将弹出对话框提示。

Close

10

关掉当前打开的文件。 Close All

关掉所有打开的文件。 Print

打印打开的文件。 Exit 退出OPS。

2.5.7. Edit菜单

OPS的File菜单如图十一所示。

图十一 Edit菜单

Undo

取消上一编辑操作。 Redo

重复上一编辑操作。 Undo All

取消上次保存文件后做的所有编辑操作。 Redo All

重复上次保存文件后做的所有编辑操作。

11

Cut 剪切 Copy 复制 Paste 粘贴 Select All 选择

Find/Change...

查找/替换。选择该菜单后,会出现查找/替换对话框,如图十二所示。

图十二 查找/替换对话框

使用时,在Find文本框填写要查找的文本,在change to文本框填写用于替换的文本。

按钮的作用分别如下: Find: 查找

Find&Change: 查找并替换

Change: 替换。一般要先单击Find按钮,然后再单击本按钮。 Change All: 查找并替换所有符合条件的文本。 另外我们还可以对查找替换的条件进行设置,如下所示: Document: 在整个文档中进行查找替换 Selection: 仅在选中的文本中进行查找替换 Consider case: 查找时区分大小写

From the beginning: 从文档开始的地方开始查找替换

12

Search backwards: 反向查找替换

2.5.8. View菜单

OPS的View菜单如图十三所示。

图十三 View菜单

Input Output

打开输入输出窗口,如图十四所示。输入输出窗口主要用来进行交互式操作,例如输入一些参数等等。一般而言,输入输出窗口都是由程序调出来,直接从菜单打开这个窗口没有什么意义。

13

图十四 输入输出窗口

Variable Watch...

打开Variable Watch窗口,如图十五所示。Variable Watch窗口可以用来查看程序中变量的值。这个功能在进行调试时很有用。

我们如果要查看某个变量的值,首先在Variable name文本框中输入变量名,然后按回车键或者单击Add按钮即可在变量列表中看到该变量的值。如果需要从变量列表中删除某变量,可以先在变量列表中选中该变量,然后单击Remove按钮。Save按钮可用于保存变量列表,以便我们以后使用。Load按钮可以把保存的变量列表加到当前变量列表中。Load&Replace按钮则是用保存的变量列表替换当前变量列表。

图十五 Variable Watch窗口

Comment Window

打开Comment窗口,如图十六所示。Comment窗口主要用来显示显示由@COMMENT命令产生的输出,如果没有Comment窗口,则@COMMENT命令产生的输出显示在输出区。

Comment窗口可以在程序中使用@WINDOW命令调出来,然后使用@WINDEND命令关闭。

14

图十六 Comment窗口

Manual Command Entry

打开手动命令输入窗口,如图十七所示。

图十七 手动命令输入窗口

我们要直接手动向外部网元输入命令,首先要通过网元栏与外部网元相连。在手动命令输入窗口中,回车键表示发送命令,所以我们输完一条命令再按回车键,手动命令输入窗口便把命令向外部网元发送,并且回车键不会产生新行。不过不用担心,我们可以通过Ctrl+o键来产生新行。

Send current按钮用于把窗口中当前命令行发送给外部网元。Send all commands按钮可以把窗口中所有的命令行发送给外部网元。如果命令的打印结果太长,我们可以用Break Response按钮中止打印输出。Clear按钮则用于把窗口清空。命令输入完毕后,我们可以单击Close按钮关闭手动命令输入窗口。

手动命令输入窗口还支持OPS脚本语言中大部分的函数,除了:@BREAK, @DRAW, @ELSE, @ENDIF, @FOR-TO, @FORM, @FUNBUSY, @GOSUB, @GOTO, @IF-THEN, @IFERROR-THEN, @INCLUDE, @INKEY, @INPUT, @LABEL, LABELEXIST, @MENU, @NEXT, @ONTIMEOUT, @PROMPT, @RESTART, @RETURN, @STOP, @W。

15

Go to line...

跳到某一行。选择该菜单,会出现一个输入窗口,如图十八所示。输入要跳转的行号,单击OK按钮即可。

图十八 输入窗口

Current Position

在运行模式下更新标识当前执行位置的箭头符号。 Clear output

清除输出区的所有内容。 Toolbar

指定是否显示工具栏。 Options...

选项,用于指定OPS的一些设置。选择该菜单后,会出现选项对话框,如图十九所示。

在改变设置后,如果单击Close按钮,那么改变的设置仅在这次的OPS使用有效。如果想下次还是使用相同的设置,必须单击Save as default按钮退出本对话框。

在General页,我们可以改变以下设置:  代码区和输出区的大小比例  位置更新

如果选择Always,则更新标识当前执行位置的箭头符号的位置在程序执行过程会不断更新(推荐大家使用),否则,箭头符号的位置只在单步执行时才会更新。

16

图十九 选项窗口

 Warnings

指定是否允许弹出对话框进行警示。  Accelerator

便捷选项。前面也提到,在代码区的左边,有三列,分别表示断点、标记行和当前执行位置。如果我们选用了这些选项,就可以直接在相应的列单击来改变行状态。例如要把某行变为断点,我们只要单击该行的最左方即可,如图二十所示。

17

图二十 便捷选项的使用

在设置对话框的Corlours页,可以对OPS的颜色进行设置,如图二十一所示。要注意如果使用颜色设置,必须选中Enable colours选项

图二十一 Corlours页

2.5.9. Debug菜单

OPS的Debug菜单如图二十二所示。

18

图二十二 Debug菜单

Run

从程序开始处开始执行。 Run Tagged 执行所有的标记行。 Run from current 从当前位置开始执行。 Stop

停止程序执行。程序停止后,可以选择Run from current菜单继续执行 Step

单步执行,也就是说一次执行一行命令。 Reset

复位所有运行时信息,主要对一些系统变量进行复位。 Add Tags

把选中的行变为标记行。 Clear Tags

把选中的行变为非标记行。

19

Clear All Tags

把所有的标记行变为非标记行。 Add Breakpoints 把选中的行变为断点。 Clear Breakpoints 取消选中的行的断点功能。 Clear All Breakpoints 清除所有的断点。 Set Position

把选中的行设置为当前执行位置。当我们使用Run from current命令时,程序就从本行开始执行。

Set and Run

从选中的行开始执行。相当于Set Position然后再Run from current。

2.6. 使用样例

看到这里,大家应该对OPS的使用方法有了大概的了解吧?好,现在我们就来看一些使用样例,实际操作一下。

2.6.1. 创建一个OPS脚本语言程序并执行

 通过桌面菜单启动OPS,如图二十三。

20

图二十三 启动OPS

 在OPS中输入例程一,如图二十四。本例程首先输出一句话“Command File

clock check.”,然后连接到DGAMSC,执行命令CACLP;,最后断开连接。

例程一

@COMMENT(\"Command File clock check.\") @CONNECT(\"DGAMSC\") CACLP; @DISCONNECT

图二十四 输入例程一

 单击保存按钮,把文件保存为example-1,如图二十五

21

图二十五 保存文件

 单击Run Mode标签,切换到运行模式,如图二十六

图二十六 切换到运行模式

 单击Run file from top按钮,OPS便把程序从头开始执行,如图二十七。这

个程序比较简单,不过我在最后一句多输了一个分号,所以最后程序没有断开网元,而是报告发现语法错误。

22

图二十七 运行程序

2.6.2. 打开已有的OPS脚本语言程序并执行

 打开OPS

 单击工具栏左边第二个按钮,便出现如图二十八的对话框。选中需要打开的

文件,切换到运行模式,运行就可以了。

23

图二十八 打开文件

2.6.3. 调试有错的OPS脚本语言程序

 首先我们对例程一进行一点修改,变成例程二,如下所示。注意前面的标号

是另加上去的,并不属于程序的一部分。在第二行,我们增加了一个变量NENAME,并赋值为“DGAM”。所以第三句话就相当于@CONNECT(\"DGAM\")

例程二

1. @COMMENT(\"Command File clock check.\") 2. @SET NENAME=\"DGAM\" 3. @CONNECT(NENAME) 4. CACLP; 5. @DISCONNECT

 执行程序,我们便看到程序执行到第三句就报错并停下来了,如图二十九所

示。错误原因是未知外部系统,也就是网元名错啦。

 这时我们可以单击Variable Watch Window按钮打开Variable Watch窗口,

输入变量名NENAME,并按回车键,NENAME便出现在变量列表中。这时我们可以看到NENAME被赋值为“DGAM”,如图三十所示。

 单击Edit Mode标签,切换到编辑模式,把第二行的\"DGAM\"修改为\"DGAMSC\",

24

然后切回运行模式,从头开始运行。这次我们便看到程序成功执行完毕,而从Variable Watch窗口我们也看到NENAME被赋值为“DGAMSC”,如图三十一。

图二十九 运行出错

25

图三十 NENAME被赋值为“DGAM”

图三十一 修正程序后重新运行成功

2.6.4. 运行OPS脚本语言程序的部分语句

 我们对例程二进行一些修改,变成例程三,如下所示。与例程二不同的是,

例程三在连接网元后,多执行了DPWSP; 命令。

例程三

@COMMENT(\"Command File clock check.\") @SET NENAME=\"DGAMSC\" @CONNECT(NENAME) CACLP;

26

DPWSP; @DISCONNECT

 通过菜单或者直接用鼠标单击代码区左边第二列把部分行变为标记行。  单击Run tagged lines按钮,OPS便把标记行执行一遍,如图三十二所示。

从图中我们可以看到CACLP指令没有执行。

图三十二 执行标记行

以上是对OPS使用的一些介绍,希望对推广OPS的使用有所帮助,欢迎大家一起探讨,使OPS在我们的工作中发挥更大的作用。

27

3. OPS脚本语言介绍

3.1. OPS脚本语言程序的组成

首先介绍一个名词:MML命令,其实也不是新东西,MML命令就是我们送给交换机执行的命令,如ALLIP等。

在OPS脚本语言程序,字符是大小写敏感的,这个需要注意一下。

一个OPS脚本语言程序主要由三部分内容组成:OPS脚本命令、MML命令和注释。 如果一行的开头为“@”、“/”、“!”字符,那么这行就是OPS脚本命令或者是注释。否则的话,就是MML命令,OPS把它转换成大写后送给网元处理。

这里有一种例外的情况,就是一条OPS脚本命令写成多行的情况,见例程一:

例程四

1. @COMMENT(\"The external system name is \ 2. es_name); @@ 这是正确的 3. @COMMENT(\"Fred,

4. my boss is managing this project\"); @@ 语法错误

一个OPS命令可能有多个参数,这些参数之间用逗号分隔开来,在一个逗号之后的参数,可以放到下一行来写。这时候OPS可以正确读完整个命令,如例程一的第一、二行,@COMMENT命令有两个参数,\"The external system name is \"和es_name,它们被分写成两行,这是正确的。但是如果逗号在一个字符串里面,那么OPS认为是一个参数,分成两行写就是错的,如例程一的第三、四行。

我们可以在一个OPS脚本语言程序里通过@INCLUDE命令调用另一个OPS脚本语言程序,被调用的OPS脚本语言程序还可以用相同的方法调用其它OPS脚本语言程序,但是OPS脚本语言程序之间不能出现循环调用。被调用的OPS脚本语言程序执行完毕后,调用程序继续往下执行。

3.2. OPS脚本命令和函数

OPS脚本语言提供了大量的命令和函数,使我们可能方便而有效地通过简单的程序编

28

写完成我们预定的任务。

OPS脚本命令除了!$$$$!命令,一般以“@”符号开头,例如@CONNECT。

OPS脚本函数在OPS脚本命令中使用,它们不以“@”符号开头,但必须以括号结尾,如GETDEST()。

根据命令和函数的功能,它们可以分成以下几大类:  错误处理  流程控制  外部系统通信  文件和打印机记录  时间相关  用户输入输出  文件系统  字符串及数字处理  进度报告  杂项  FIOL命令

FIOL命令本身是一种独立的语言。在OPS出现之前,爱立信提供了一个软件,可以使用FIOL命令进行编程。OPS支持FIOL命令主要是为了达到后向兼容的目的,也就是说,以前编写的FIOL命令程序我们同样可以在OPS中使用。

下面按照命令和函数的分类对其进行简单的介绍。

3.2.1. 错误处理

指定是否进行错误检查。如果进行错误检查的话,当使用MML命令出错时,便会停止执行。如果不进行错误检查,即使出错,程序也继续执行。

@CHECK

@IFERROR-THEN 如果错误就执行某些命令。 @SETERRORFLAG

把OPS变成出错状态

GETERRORFLAG()获知OPS是否出错

29

3.2.2. 流程控制

标识被调用脚本程序的结束 跳出当前的@FOR-TO循环

与@IF-THEN搭配使用,起分支作用。当不满足@IF-THEN的条件时,便执行@ELSE部分的命令。

!$$$$! @BREAK @ELSE

@ENDIF 与@IF-THEN及@IFERROR-THEN搭配使用。一般在@IF-THEN及@IFERROR-THEN中需要使用多条OPS命令的时候才会用到@ENDIF。

@GOTO @IF-THEN @INCLUDE

跳转语句,用于跳转到程序的某个标签(LABEL) 满足条件时执行一些命令 调用其它OPS脚本语言程序

@LABEL 定义@GOTO和@GOSUB命令要跳转的标签 @GOSUB 调用子程序 @RETURN 子程序结束语句 @FOR-TO FOR循环的开始语句 @NEXT

FOR循环的结束语句

@ONDISCONNECT 用于在网元断开时进行相应的处理 @ONTIMEOUT @RESET @RESTART @QUIT

用于在用户输入超时情况下进行相应的处理 复位程序运行时数据信息 重新执行脚本程序

退出脚本程序解释程序。(OPS脚本语言是一种解释语言,所以执行时会启动解释程序进行解释。)

@STOP

LABELEXIST()

停止脚本程序的执行 检查某个标签是否存在

3.2.3. 外部系统通信

连接到一个外部网元 断开与外部网元的连接

@CONNECT @DISCONNECT

30

@FUNBUSY 指定在外部网元执行命令出现function busy情况时,脚本程序每隔多久重新执行该命令以及尝试多少次。

@LOGOF 在执行命令@ORDERED(“OFF”)后,再使用本命令以显示延时响应和自发报告

@LOGON @MARK @ORDERED @REPORT

取消@LOGOF的作用 改变缓冲区的开始位置 控制延时响应的接收

用于控制来自系统12类型的外部网元的连续延时响应的接收

@SEND @SETDEVID

向外部网元直接发送命令

设置设备标识参数,该参数被MTP通信的协议处理程序使用(仅用于TMOS)

@SETREPLY @SPONTREP @SPONTREPOFF @UNSETDEVID @WAITFOR @WAITREPLY GETDEST() GETDEVID() GETEXCHHDR() GETMARK() GETMODE() REPLY() REPLYLEN() SCAN()

改变外部响应的状态(接受或者不接受) 预定外部网元的自发报告

停止@SPONTREP命令预定的自发报告

解锁MTP通信使用的设备标识参数(仅用于TMOS) 等待还有指定字符串的响应 等待响应

返回当前连接的外部网元的名称 读取MTP通信中使用的设备标识 返回已连接的交换机的标题 获取缓冲区的MARK值 返回已连接的交换机的类型 获取响应的某一行 获取缓冲区的行数

在缓冲区中搜索指定的字符串

3.2.4. 文件和打印机记录

打开logfile功能

@LOG

31

@CLOSE @SELPRINT GETLOG() GETPRINT()

关闭logfile功能 指定打印机

获取已打开的logfile名称 获取正在使用打印机

3.2.5. 时间相关

使一个指定的日期时间前进指定的间隔 判断一个指定的时间是在当前时间之前还是之后 使一个指定的日期时间倒退指定的间隔

ADVANCE() INHISTORY() REGRESS()

3.2.6. 用户输入输出

清除输入输出窗口和Comment窗口的内容 在输出区或者Comment窗口显示指定的字符串 在输入输出窗口进行图形化操作 在输入输出窗口生成可供用户输入的图形 弹出窗口以让用户输入一个字符 弹出窗口以让用户输入字符串

与@DRAW命令一起生成菜单以供用户使用

弹出对话框,由用户选择继续、停止或者停止并退出程序的执行

@CLRSCR @COMMENT @DRAW @FORM @INKEY @INPUT @MENU @PROMPT

@WINDEND @WINDOW

关闭Comment窗口

打开Comment窗口并清空Comment窗口的内容

3.2.7. 文件系统

改变当前路径为指定路径 删除指定文件 创建一个新的目录 打开一个文件以进行读取

@CHDIR @ERASE @MKDIR @OPENREAD

32

@READ @RENAME @RMDIR @VIEWFILE @WRITE

CENTRALDIR() DISKFREE() GETDIR() PRIVATEDIR()

读取@OPENREAD命令打开的文件的内容

为已有文件改名,或者把一个文件移到另一个目录并改名 删除指定的目录 显示指定的文件 把指定内容写进指定文件

返回OPS_CENTRALDIR路径,一般是自己的家目录 查询硬盘剩余空间 获取当前路径

返回OPS_ PRIVATEDIR路径,一般是自己家目录里的cha/cmdfile目录

SAVEDIR() 返回OPS_ SAVEDIR路径,一般是自己家目录里的cha/reponse目录

SELFILE() 弹出对话框给用户选择文件

3.2.8. 字符串及数字处理

把指定的参数连成一个字符串 复制字符串的指定部分 返回十六进制数的十进制数值 返回十进制数的十六进制数值 返回字符串的长度

把一个字符串全部转换为小写

在字符串中填充空白字符以获得整齐美观的视觉效果 在一个字符串里面查找另一个字符串的位置 去除一个字符串头尾的空白字符、制表符和换行符 把一个字符串全部转换为大写

CONCAT() COPY() DECIMAL() HEX() LENGTH() LOWCASE() PAD() POS() TRIM() UPCASE()

3.2.9. 进度报告

设置阶段值以表明当前OPS脚本执行的状态 设置进度计数器

33

@SETPHASE @SETPROGRESS

@SETTOTALCOUNT 设置进度计数器的目标值 @SETPPROGRESS @GETPHASE @GETPROGRESS

使进度计数器前进指定值

获取由@SETPHASE命令设置的进度状态 获取进度计数器的值

@GETTOTALCOUNT 获取进度计数器的目标值

3.2.10. 杂项

@DEC @INC @DELAY @DELAYSEC @EXECUTE @FLUSHVAR @MAIL @SET GETDATE() GETSESSIONID()VAREXIST() VERSION()

3.2.11. FIOL命令

/*…*/ @A @C @E @G @H @I @L

使变量的值减一 使变量的值加一

使程序停止执行指定的分钟数再继续执行 使程序停止执行指定的秒数再继续执行 执行一条UNIX命令再返回 删除指定变量 发送邮件 设置变量的值

返回系统的日期、时间和星期几 获取当前OPS会话号 判断变量是否存在

获取正在使用的脚本程序解释程序的版本

见@COMMENT

打开或者关闭MML命令自动确认功能 见@CLOSE 见@LOGOF

仅仅是为了兼容性而保留的命令,没有意义 以字符十六进制码的形式向外部网元发送字符见@INCLUDE 见@LOG

34

@/W1,W2,…./ 检查外部网元的下一个即时响应是否包含指定的字符系列

@P @R

见@PRINTER

如果@R+在@/W1,W2,…./命令之前执行,那么即使外部网元的下一个即时响应不包含指定的字符系列程序也继续往下执行

@S @T @W @Z

见@LOGON 见@DELAYSEC 见@PROMPT 打开自动响应检查

3.3. MML命令、注释、脚本命令和函数

前面已经对这些概念进行了介绍,现在再归纳一下。

除了一条OPS脚本命令写出多行的情况,如果程序的某一行的第一个非空字符不是“@”、“!”、“/”,那么这一行就被认为是MML命令。如果MML命令没有进行变量替换(后面会介绍OPS的这个功能),那么OPS直接就把MML命令送给外部网元执行。

除了!$$$$!命令,@@和“!”符号开头的都是注释。注释可以从一行的任何地方开始。 “!”符号开头的注释可以和MML命令写在同一行。注释可以写在两个叹号之间,MML命令的分号之后,如下所示:

CACLP; !Displays the current date and time!

注释也可以写在MML命令的分号之前,这时只要求有前面的那个叹号,如下所示: CACLP !Displays the current date and time; 这种情况下,注释和命令一起被记录下来。

例程二全面的展示了如何在程序中写注释,如下所示:

例程五

@@ Open the Input Output window

! Clear the input output window

35

@INKEY() @@ Wait for a key to be pressed

@WINDEND !Close the window

注释的书写在程序的编写中有很重要的作用。所谓好记忆不如烂笔头。我们在写程序的时候一定要把注释写好,把自己的思路记录下来,否则的话,给别人看,别人看不懂;日后自己看,也可能不记得当时为什么这样写程序。有人说,一个合格的程序员写的注释应该比程序代码多,我们不用这么专业,不过必要的注释还是要写好。

如我们前面所说的,OPS脚本命令以“@”符号开头,而OPS脚本函数则在最后以括号结尾,这样子,OPS脚本命令、函数就和变量名区分开来了。

3.4. 变量

前面说了很多次变量这个概念。其实,变量就像一个容器,它包含两部分:变量名和变量值。

变量名就像容器的标签,把容器区分开来。变量名不能包含“< > = + - * / ( ) , ' \" { } @”等字符,不能以“$”、“#”开头。变量名大小写不敏感,就是说Abc和abc是相同的变量名。变量名的长度也没有限制。

变量值就像容器装着的东西,是变量的内容,也是我们真正想要的目标。我们只能通过变量名来使用变量值。在使用变量值之前,必须使用@INPUT、@READ、@SET等命令来给变量赋值,这些命令也可以用来改变变量的值。当然了,我们可以用VAREXIST函数检查变量是否已经赋值。如果我们不再需要某个变量,可以使用@FLUSHVAR把它删除掉。只要电脑的内存够大,我们可以在程序里随意增加变量。因为变量毕竟是占用内存空间的,所以我们还是应该稍为对变量的使用注意一下,不要出现内存不足的情况,尽管这种可能性很小。

OPS是以字符串的形式来存储变量值的,变量值的长度不能超过1000个字符。有些变量我们是以数字的形式给它赋值,但是OPS会把它转换成字符串的形式存储;在我们需要以数字的形式使用变量时,OPS再把它由字符串转换成数字。

36

3.5. 变量替换

变量替换就是把变量值直接在程序替换变量名,是OPS提供的一个灵活而有用的功能。 前面已经提到,OPS是以字符串的形式来存储变量值的。如果我们把变量名放在一对大括号里面,解释程序在解释的时候,就直接用变量值替换掉变量名了。我们可以在一个程序进行多次变量替换,也可以进行嵌套替换。

我们一起看看例程三里面的变量替换:

例程六

1. @SET SNB = 9876543

2. SUSCP:SNB={SNB},LIST; !Get the category!

在第一行里,变量SNB被赋值为9876543,第二行我们可以看到它是一条MML命令,一般是不作处理,直接送给外部网元执行的。但是解释程序发现第二行里面出现变量替换{SNB},所以它首先用SNB的值来替换这部分内容,也就是说,发送给外部网元的实际是:SUSCP:SNB=9876543,LIST;

从例程三可见,变量替换起到了一个桥梁的作用,把OPS脚本命令、函数和MML命令结合在一块了。我们通过OPS脚本命令、函数对变量进行处理,而处理后的变量则通过变量替换应用于MML命令中。

变量替换是在程序执行时进行的,因为只有在执行时,解释程序才知道应该用什么值进行变量替换,请看例程四:

例程七

1. @SET VAR = 123

2. @IF x > 10 THEN SET VAR = 234

3. @COMMENT(\"The value of VAR is {VAR}\")

在这个例程中,前两行对变量VAR进行赋值,第三行对VAR进行变量替换。我们可以看到,VAR替换的结果取决变量X:如果X大于10,则VAR被234替换,否则,VAR被123替换。这里顺便说一下,如果在一行里使用了多个OPS脚本命令,如本例的第二行使用了@IF和@SET两个命令,则只有行首的命令需要在前面加“@”符号。

37

值得注意的是,变量替换和变量赋值有着很大的区别,请见例程五:

例程八

1. @SET VAR = \"123+456\"

2. @COMMENT(VAR) @@ \"123+456\" is printed 3. @COMMENT({VAR}) @@ \"579\" is printed

在第二行里,没有出现变量替换,所以输出的是变量VAR的值\"123+456\"。 在第三行使用了变量替换,在替换后就变成了@COMMENT(123+456),这样解释程序在解释时,认为是先把123和456相加,再输出,所以输出结果是579。

在以下情况里,变量替换是不可以进行的: 1. 大括号里面的变量还没有赋值

2. 大括号不匹配,也就是说少了或者多了大括号 3. 在@LABEL命令里面不能进行变量替换 第三种情况我们用例程六来说明:

例程九

1. @SET MYLABEL = \"ABC\" 2. ... 3. @GOTO ABC 4. ...

5. @LABEL {MYLABEL}

在这个例子里面,第五行想要进行了变量替换,但由于这是在@LABEL命令里面进行,所以是错误的。

但是,我们可以在其它命令里面使用标签替换,如例程七所示:

例程十

1. @SET MYLABEL = \"ABC\" 2. ...

3. @GOTO {MYLABEL} 4. ...

38

5. @LABEL ABC

使用例程七这种方法,我们就可以一个变量,实现不同的跳转。

3.6. 模拟数组

对于一些性质相近的变量,我们可以把它集中起来,组成数组以方便使用和管理。OPS并没有提供真正数组类型,而是通过变量替换实现模拟数组。详见例八:

例程十一

1. 2. 3. 4. 5. 6. 7.

@FOR X = 0 TO 9 @SET LINE{X} = \"\" @NEXT X

@OPENREAD(FILE) @FOR X = 0 TO 9 @READ(LINE{X}) @NEXT X

在上例的第一到第三行,程序实现了一个FOR循环。第二行是FOR循环里面的操作,这里面用到变量替换。这段语句执行下来实际上是这样的:首先X赋值为0,执行到第二行,进行变量替换,变成了@SET LINE0 = \"\",也就是给LINE0赋空值;然后X加1,变成1,再执行第二行,给LINE1赋空值;然后X再加1,变成2,再执行第二行,给LINE2赋空值……一直循环到X等于9为止。最后就是LINE0到LINE9都赋空值。

接着程序在第四行打开一个文件进行读操作。

五到七行还是一个FOR循环,这次做的就是每次从文件里面读一行出来,分别赋值给LINE0到LINE9。

大家在试验时可以打开Variable Watch window,看看LINE0到LINE9的值的变化情况。

3.7. 字符串

字符串是放在一对引号(包括单引号和双引号)中间的字符集合,但是中间的字符不可以是换行符或者与两端引号相同的引号,见例程九。

39

例程十二

1. 2. 3.

@SET VAR2 = \"The \"VAR2\" value\" @@ Syntax Error @SET VAR2 = \"The 'VAR2' value\" @@ This is ok @SET VAR2 = 'The \"VAR2\" value' @@ This is also ok

第一行的字符串在两端的双引号里面又出现双引号,所以是错误。后面两句虽然在引号里面又有引号,但是因为是不同的引号,所以是正确的。

如我们前面所说的,一个字符串也不能超过1000个字符。

3.8. 操作符

OPS中,我们可以使用以下操作符: <

小于 小于或等于 等于 不等于 大于或等于 大于 加 减 乘 除 负号 正号 逻辑与 逻辑或

<= =

<> >= > + - * / - +

AND OR

其中<、<=、=、<>、>=、>、AND、OR等操作符仅用于@IF-THEN和@IFERROR-THEN命令的条件表达式中。

在进行数字操作时,OPS会自动把字符串转换成数字进行处理,如例程十所示:

例程十三

40

1. 2.

@SET X = 123 @@123 converted to string @SET Y = X + 1 @@X converted back to integer

在第一行里,123被转换成字符串放在变量X中存储,但在第二行中,由于出现加法,X的值被转换为数字进行加法,所以Y最后被赋值124。

3.9. 错误处理

从错误处理部分命令,我们可以看到在程序运行的过程中,OPS用一个错误标识来记录错误发生的情况。如果MML命令执行出错,错误标识被置为有效,并且OPS停止程序的执行。如果我们不想OPS停下来,我们可以使用@CHECK(“OFF”)命令。执行@CHECK(“OFF”)命令后,如果MML命令或者OPS脚本命令执行出错,错误标识仍被置为有效,但是程序不会停止。这时,我们可以使用@IFERROR-THEN命令检查是否出错并进行出错处理。

例程十一演示了如何进行错误处理:

例程十四

1. !No connection yet 2. @CHECK(\"OFF\") 3. ALACP;

4. @IFERROR THEN COMMENT(\"Can not send ALACP\") 5. @ELSE COMMENT (\"ALACP has been sent\") 6. @CHECK(\"ON\")

例程在第三行向外部网元执行ALACP;指令,如果没有连接外部网元,这条指令就不能发送出去,OPS会把错误标识置为有效,所以第四行进行错误检查,如果出错就输出错误信息。而第五行则使用@ELSE命令处理没有出错的情况。

41

4. OPS程序实例分析

4.1. 在多个网元里面执行相同的指令

我们经常要做的一些事情就是在多个网元里执行相同的指令,OPS可以把这件繁琐累人的工作变得轻松起来。如例程一所示:

例程十五

1. @CONNECT(\"DGABSC1\") 2. @GOSUB DOSOMETHING 3. @DISCONNECT 4. 。。。

5. @CONNECT(\"DGQBSC1\") 6. @GOSUB DOSOMETHING 7. @DISCONNECT 8. @QUIT

9. @LABEL DOSOMETHING 10. RRGBP; 11. @RETURN

在本例程中,9行到11行定义了一个子程序。通常情况下,如果我们在程序中有一部分命令要多次执行,就可以把这些指令组成一个子程序,在需要的时候调用该子程序。例中的子程序很简单,就是执行RRGBP;命令。在程序的前面,我们就可以连接网元,然后调用子程序,再连接其它网元,调用子程序,如1到7行所示。做完这些事情后,记得在最后退出执行(8行的@QUIT命令),否则的话,由于OPS是顺序解释程序的,所以在执行完7行后,继续执行后面的语句,这就和我们的想法不一致了。

4.2. 做LOGFILE

有时候我们可能会每天做一些事情,并且希望做个logfile,以供备案,可以如下例一般:

例程十六

42

1. @LOG(CONCAT(SAVEDIR(), \"CHECKBSC\TE(),1,6),\".LOG\")) 2. @COMMENT(GETDATE())

3. @COMMENT(\"****************************************\") 4. @CONNECT(\"DGABSC1\") 5. @GOSUB DOSOMETHING 6. @DISCONNECT 7. 。。。

8. @CONNECT(\"DGQBSC1\") 9. @GOSUB DOSOMETHING 10. @DISCONNECT 11. @QUIT

12. @LABEL DOSOMETHING 13. RRGBP; 14. @RETURN

本例在例程一的基础上增加了logfile功能,GETDATE()函数可以返回日期和时间,我们这里想把文件按照日期分开,所以用COPY(GETDATE(),1,6)函数把日期提取出来,SAVEDIR()是我们文件要保存的目录,最后我们用CONCAT函数生成完整的文件名:目录/ CHECKBSCYYMMDD.LOG。CONCAT函数的功能是把几个字符串进行合并。形成文件名后,程序使用@LOG命令打开文件记录功能。

4.3. RESPONSE分析与写文件

例程十七

1. @SET FILE=CONCAT(SAVEDIR(), \"FIND WHO HAS OPENNED GPRS.TXT\") 2. @CONNECT(\"DGAHLR\")

3. @WRITE(FILE,\"************DGAHLR***************\") 4. @SET ONEMSISDNS=8613 5. @GOSUB GETMSISDN 6. @DISCONNECT

43

7. @CONNECT(\"DGBHLR\")

8. @WRITE(FILE,\"**************DGBHLR**********\") 9. @SET ONEMSISDNS=8613 10. @GOSUB GETMSISDN 11. @DISCONNECT

12. @QUIT

13. @LABEL GETMSISDN

14. HGPDP:MSISDNS={ONEMSISDNS}; 15. @LABEL FINDNEXT

16. @SET LINE1=SCAN(\"MSISDN\") 17. @IF LINE1=0 THEN RETURN

18. @SET MSISDN=COPY(REPLY(LINE1+1),3,11) 19. @WRITE(FILE,MSISDN) 20. @MARK(LINE1) 21. @GOTO FINDNEXT

本例的主要功能是查找已经开通GPRS功能的用户的手机号。MML命令HGPDP可以把一个号段里面已经开通GPRS功能的用户的手机号打印出来,程序通过对HGPDP的输出结果进行分析以获得用户的手机号,并把这些手机号写到一个文件中。

第一行程序通过CONCAT函数生成了保存手机号的文件名,然后赋值给变量FILE。第二行连接网元。第三行则向FILE写进一个标识行,以便把文件里的手机号按照HLR分开。@WRITE命令用于写文件。这个命令有两个参数:一个是文件名,程序中是FILE;另一个是要写进文件的内容。一般@WRITE命令一次向文件写一行。第四行设置要查询的号段为8613,赋值给ONEMSISDNS。接着程序在第五行调用子程序GETMSISDN。子程序GETMSISDN由13到21行组成。13行定义了子程序的名字。14行是MML命令HGSDP,这一行使用了变量替换,主要是把8613放到MML命令里。因为后面要重复查找MSISDN,所以15行定义了一个标签FINDNEXT,以便后面查找完一次后可以跳转回来再查。因为HGSDP的打印结果里面有点类似下面的形式:

44

MSISDN …. 8613912345678 ….. ….

MSISDN …. 8613912345679 ….

也就是说在每个手机号的上一行会出现“MSISDN”字符串,并且手机号占用了其所在行第三到第十四的位置。后面程序就根据这些特点来取手机号。16行使用了SCAN函数。SCAN函数的作用是在MML的打印输出里面查找指定字符串,并返回该字符串在打印输出里的行号。如果没有找到字符串,则SCAN返回0。SCAN函数只有一个参数,就是要查找的字符串。16行用SCAN函数查找字符串“MSISDN”,并把结果赋值给LINE1。17行检查LINE1是否为0,如果为0,说明RESPONSE里面没有“MSISDN”字符串,也就是没有手机号了,这个时候就使用RETURN命令退出子程序,回到第六行继续执行。如果LINE1不为0,则程序继续执行18行。18行使用到REPLY函数和COPY函数。REPLY函数用于获取RESPONSE中的某一行。它只有一个参数就是获取的行号,程序中这个值是LINE1+1,因为LINE1是“MSISDN”所在行的行号,而手机号在下一行,所以要加1。COPY函数是把字符串的某一部分复制出来。它有三个参数:被复制的字符串,这里是手机号所在行;复制开始的位置,这里是3;复制的程度,这里是11,也就是手机号的长度。获得手机号后,手机号赋值给MSISDN变量。19行把手机号写进文件中。这个时候,我们就完成了一个手机号的获取,但是后面还可能有手机号,所以还要再进行查找,直到没有手机号为止,也就是直到16行的SCAN函数结果为0。所以我们在21行进行跳转,回到15行继续执行。但是这样直接跳转会有问题,因为我们下次使用SCAN函数的时候,它还是从RESPONSE缓冲区的首行开始查找,也就是说下次会找到相同的手机号。怎么办呢?OPS提供了MARK函数解决这个问题。MARK函数的作用是改变RESPONSE缓冲区的开始行,也就是SCAN查找的开始行。它只有一个参数:开始行。程序在20行把开始行指定为LINE1,这样下次SCAN查找的时候就是从LINE1后面的行开始找,这样就不会出现重复查找的情况了。

这样程序不停查找,RESPONSE缓冲区不断缩小,最后出现SCAN结果为0,所以程序返回第六行,断开当前网元,然后进行下一个HLR的分析。

变量替换在OPS起到了一个桥梁的作用,使变量可以应用于MML命令。从本例程可以看出,SCAN、REPLY、MARK三个函数可以说起到了另一个桥梁的作用,使OPS脚本命令、函数可以获取MML命令的RESPONSE(MML命令的打印输出)内容,并进行分析

45

和处理。

4.4. 读文件

例程十八

1. @SET FILETOOPEN = \"/home/lira/agsue/dgehlr.ms\" 2. @SET CURRENTHLR=\"DGEHLR\" 3. @GOSUB ONEHLR

4. @SET FILETOOPEN = CONCAT(\"/home/lira/agsue/notfound\5. @SET CURRENTHLR=\"DGFHLR\" 6. @GOSUB ONEHLR

7. @QUIT

8. @LABEL ONEHLR

9. @SET NOTFOUNDFILE = CONCAT(\"/home/lira/agsue/notfound\10. @SET FOUNDFILE = CONCAT(\"/home/lira/agsue/found\

11. @@ the last line of the file must be null line and not a mobile number 12. @OPENREAD(FILETOOPEN) 13. @CHECK(\"OFF\")

14. @CONNECT(CURRENTHLR)

15. @LABEL READFILE 16. @READ(ISDN)

17. @IFERROR THEN GOTO FILEEND

18. @IF TRIM(ISDN)=\"\" THEN GOTO READFILE

19. HGSDP:MSISDN=86{ISDN};

46

20. @SET FOUND=SCAN(\"NOT CONNECTED\")

21. @IF FOUND>0 THEN WRITE(NOTFOUNDFILE, ISDN ) 22. @IF FOUND>0 THEN GOTO READFILE

23. @@ IF FOUND , THEN 24. @SET LINE=SCAN(\"IMSI\")+1

25. @SET IMSI = TRIM(COPY(REPLY(LINE), 16, 17)) 26. @WRITE(FOUNDFILE, ISDN) 27. AGSUE:IMSI={IMSI}; 28. @GOTO READFILE

29. @LABEL FILEEND 30. @RETURN

现在我们在做的一件事情是回收号码。回收号码首先要使用AGSUE指令在鉴权中心删除IMSI和EKI的关联。客服营销那边只提供用户的手机号,而且不分HLR。所以我们可以把手机号放在一个文件里,由程序读这个文件,读一个手机号,就查是否在当前HLR:如果不是就读下一个手机号;如果是就把IMSI拿出来,生成AGSUE指令,送给HLR执行。同时为了减少下一个HLR的工作量,我们可以把不属于当前HLR的号码单独放在一个文件里面,到下一个HLR就不再读已经删除了EKI的手机号。

例程四就是完成我们上述的工作。第一行指定存放手机号的文件,赋值给变量FILETOOPEN。第二行指定当前HLR,赋值给CURRENTHLR。第三行则调用子程序ONEHLR。子程序ONEHLR完成一个HLR的处理,由8到30行组成。9、10两行分别指定保存不属于当前HLR和属于当前HLR号码的文件。12行打开文件FILETOOPEN进行读操作。13、14行分别是取消错误检查功能和连接外部网元。由于我们要多次从文件读取手机号,所以15行定义了一个标签以进行跳转。16行读取一个手机号。17行检查读取文件是否出错,如果出错,说明文件已经读完,所以便从子程序返回。这里的返回不是直接使用@RETURN命令,而是先跳转到29行,然后再使用@RETURN命令返回。18行检查读出的是否为空号,如果是,就跳转到15行读下一个。19、20、21、22行通过HGSDP命令检查手机号是否属于当前HLR。如果不属于当前HLR,则把号码单独放在指定的文件里面,

47

并跳转到15行读下一个手机号。23到28行则是读取手机号对应的IMSI,生成并执行AGSUE命令,最后也跳转到15行读下一个手机号。

例程十九

1. @LOG(CONCAT(SAVEDIR(), \"CHECKBSC\TE(),1,6),\".LOG\")) 2. @COMMENT(GETDATE())

3. @COMMENT(\"*************************************\") 4. @OPENREAD(“/home/abc/nelist”) 5. @CHECK(\"OFF\")

6. @LABEL READFILEBEGIN 7. @READ(NENAME)

8. @IFERROR THEN GOTO READFILEEND 9. @CONNECT(NENAME) 10. @GOSUB DOSOMETHING 11. @DISCONNECT 12. @LABEL READFILEEND 13. @QUIT

14. @LABEL DOSOMETHING 15. RRGBP; 16. @RETURN

例程五是对例程二的进一步改进。主要的改动是把网元名称放到文件中(例程为文件/home/abc/nelist),文件内容如下:

DGABSC1 DGABSC2 …. DGQBSC1

程序运行时则从文件中读取网元名称,然后在连接网元,执行命令。程序使用的OPS命令前面基本上已经介绍过,这里不再赘述。

48

从以上例子可以看到,我们日常很多工作都可以通过简单的OPS编程来完成。只要在OPS程序的编写只要注意利用MML命令的特点,同时结合丰富的OPS脚本命令、函数,一定可以编出令我们满意的OPS程序出来。

49

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- xiaozhentang.com 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务