jltde
銀牌會員
發(fā)短消息
關(guān)注Ta
積分 3267
帖子 178
威望 2958 個
禮品券 5 個
專家指數(shù) 1
注冊 2007-11-21 專業(yè)方向
回答問題數(shù) 0
回答被采納數(shù) 0
回答采納率 0%
|
大
中
小
發(fā)表于 2011-05-29 19:20:09
只看樓主
|
【資料名稱】:MACRO編寫方法之入門篇
【資料作者】:jltde
【資料日期】:20110529
【資料語言】:中文
【資料格式】:DOC
【資料目錄和簡介】:
一直以來,我們的維護工作存在很多重復勞動,當設備集中管理時這種重復尤為明顯,在如此多的網(wǎng)元上,即使是修改一下用戶密碼這個簡單操作,手工執(zhí)行就要花費很長的時間,更不要說其他復雜的操作了。而如果我們利用NOKIAHIT工具編寫一個MACRO程序的話,那么,半天甚至一天的工作量在一個小時就有可能完成,同時,大大減少甚至完全避免手工操作時的一些人為錯誤。
MACRO編寫方法之入門篇一直以來,我們的維護工作存在很多重復勞動,當設備集中管理時這種重復尤為明顯,在如此多的網(wǎng)元上,即使是修改一下用戶密碼這個簡單操作,手工執(zhí)行就要花費很長的時間,更不要說其他復雜的操作了。而如果我們利用NOKIA
HIT工具編寫一個MACRO程序的話,那么,半天甚至一天的工作量在一個小時就有可能完成,同時,大大減少甚至完全避免手工操作時的一些人為錯誤。
在我初接觸NOKIA設備時,看到別人在做有些例行的工作時總是運行MACRO,又快又準確。于是我也萌發(fā)了編寫MACRO使自己盡量從一些簡單重復的勞動中解脫出來的想法,但是由于缺乏MACRO編寫的入門級資料,所以都是通過看別人寫的MACRO和HIT幫助來試著編寫。在我編寫了一些MACRO之后,發(fā)現(xiàn)其實MACRO的框架結(jié)構(gòu)很固定,而且常用的系統(tǒng)函數(shù)并不多,只要掌握了這些知識,編寫一個小MACRO并非一件難事。所以我想把有關(guān)編寫MACRO方面的一些知識總結(jié)出來,和大家分享,希望可以給初學者提供幫助,以便大家能很快地了解并且掌握HIT這個工具,提高我們的工作效率。
基于我的學習過程,我想以分析常見問題的形式來介紹一些編寫MACRO的基本方法和常用的系統(tǒng)函數(shù)。
一.如何運用MACRO在一個網(wǎng)元上執(zhí)行一系列的操作。
NOKIA MACRO的語法類似于C語言。程序是由函數(shù)構(gòu)成的。下面以在網(wǎng)元上新建用戶為例進行說明。登陸到要建用戶的網(wǎng)元后,運行下面的MACRO,就可以新建PROFILE:HWWH ,新建用戶:JWFJWF。 修改MACRO中粗體的地方就可以建其他用戶了。
function main() //function是關(guān)鍵字,表示一個函數(shù)的開始,main是這個函數(shù)的函數(shù)名
device("NE_SCAN"); //使用的連接,與我們在HIT上登陸網(wǎng)元用的設備一致
ZIAA:HWWH:ALL=150 ARAPW=NO,VTIME=FOREVER,ACCESS=COM,:; //新建PROFILE
ZIAH:JWFJWF:HWWH:; //新建用戶
Z; //網(wǎng)絡資源有限,所以執(zhí)行完最好就退出網(wǎng)元
Z;
endfunction //以endfunction標志函數(shù)的結(jié)束
|
二.通過上面的例子我們認識了MACRO,那么如何在多個網(wǎng)元上執(zhí)行相同的操作呢?
HIT工具給我們提供了一組用于連接外部excel文件的函數(shù)集DDEFUNCT。利用這些函數(shù)我們可以對EXCEL文件進行操作,通常我們將要執(zhí)行操作的網(wǎng)元列表在EXCEL文件中。具體介紹如下:
1.打開一個EXCEL文件:
語法:
integer ddeconnect(string Service, string Topic);
返回值為整型變量,如果為0則表示并沒有和excel文件連接上,利用這個返回值我們可以判別EXCEL文件是否打開。
例如:我們要打開的EXCEL文件為 網(wǎng)元信息列表.xls 的sheet1,則可以這樣寫
file_excel=ddeconnect("Excel","[網(wǎng)元信息列表.xls]sheet1");
file_excel 是我們定義的一個整型變量,用于在程序中代表這個excel文件,如果它的值不為0則表示成功。
|
2.從打開的EXCEL文件中讀取信息
語法:
string dderequest(integer Num,string Item [, integer Timeout])
返回值如果是空字符說明沒有讀到否則成功。利用這個返回值我們可以判別讀操作成功與否。注:語法中用[ ]括起來的參數(shù)是可以不給出的。
例如:一般我們都將要訪問的網(wǎng)元寫在excel表的第一列,那么這個列值是不變的,而行數(shù)是在變化的,我們用字符型變量name_ne來記錄從EXCEL中讀取的網(wǎng)元名,用row_ne來記錄當前程序執(zhí)行了幾個網(wǎng)元了,R,表示是行數(shù),%d代表一個整型變量,程序執(zhí)行時將把當前row_ne的值賦值給它,C1表示第一列,如果row_ne =3,則("R%dC1",row_ne)就表示R3C1。執(zhí)行完這條語句,name_ne的值就是excel表中第三行第一列的值。
name_ne=dderequest(file_excel,strprint("R%dC1",row_ne));
|
3.向已經(jīng)打開的EXCEL文件寫信息
語法:
integer ddedata(integer Num,string Item,string Data [,integer Timeout])
返回值如果是0說明沒有執(zhí)行成功否則成功,利用這個返回值我們可以判別寫操作成功與否。
例:如果我們在EXCEL文件中寫上“OK”作為操作執(zhí)行成功的標識,可以執(zhí)行語句:ddedata(file_excel,strprint("R%dC2",row_ne),”O(jiān)K”);
此處的row_ne和2中作用類似,因為OK是一個常量所以要用引號引起來,如果是變量就不要用引號了。假設row_ne=3,則這個語句執(zhí)行完就會在EXCEL表的第三行第二列寫上OK,表示執(zhí)行成功;
同樣如果執(zhí)行失敗了用“FAIL”作為標識,可以使用語句:ddedata(file_excel,strprint("R%dC2",row_ne),”FAIL”);
|
三.如何判定指令執(zhí)行成功與否以及執(zhí)行結(jié)果怎樣?
我們知道,在NOKIA設備上執(zhí)行完一項操作后,系統(tǒng)會給出執(zhí)行的結(jié)果,同時,對于每一項修改操作,都會有相應的檢查指令。不同的執(zhí)行結(jié)果,其輸出的字符串也存在差異,在程序中通過提取差異的字符串對運行結(jié)果進行判斷,從而執(zhí)行相應后續(xù)處理,這樣便增強了程序的完整性和健壯性。如果將操作執(zhí)行結(jié)果輸出到EXCEL文件的話,使得使用它的用戶可以知道程序執(zhí)行的狀況,這樣更增加了程序的友好性,以便用戶在程序執(zhí)行失敗的網(wǎng)元上手工進行處理。
HIT提供了getline這個系統(tǒng)函數(shù)幫助我們提取字符串,然后通過判斷語句或者分支語句可以對操作執(zhí)行后的各種情況進行分類處理。
語法:
integer getline( string line, ["search criteria"], [variable..])
結(jié)果為0則說明沒有找到,否則表示找到了符合查找規(guī)則的輸出行,這個值記錄在變量line中。
|
1.
結(jié)合我們前面介紹的對EXCEL文件的操作,就可以實現(xiàn):針對不同的執(zhí)行結(jié)果,在表格中給出不同的標識。例如,當輸出結(jié)果包含被判斷的字符串‘variable’時,在表格中標識為“OK”,否則標識為“FAIL”。舉例:在執(zhí)行對交換機更改數(shù)據(jù)的指令時,如果更改成功,通常會輸出字符串“COMMAND EXECUTED”,此時可以以此判斷。例子如下,其中l(wèi)inerecord是我們定義的一個字符串變量,用于存放讀取的那一行的值:
if (getline(linerecord,"'COMMAND EXECUTED'"))
ddedata(file_excel, strprint("R%dC2",row_ne),"OK");
else
ddedata(file_excel, strprint("R%dC2",row_ne),"FAIL");
endif
2.
上面的例子比較簡單,只需要判斷操作執(zhí)行成功與否。假如我們需要知道設備中具體單元的狀態(tài),例如MB單元是否處于正常狀態(tài),這時就需要對多行結(jié)果逐行分析,同時將結(jié)果寫回EXCEL文檔,怎樣能夠?qū)崿F(xiàn)呢?
我們可以利用getline和logseek這兩個函數(shù)來配合執(zhí)行。在一條指令執(zhí)行之后,系統(tǒng)自動將閱讀指針設置在執(zhí)行結(jié)果開始的位置,使用logseek可以控制這個指針的位置,然后可以用getline取得指針所在行的值,進行分析比較。
語法:
logseek(integer SeekStart,[integer LineOffset]);
這條指令執(zhí)行后沒有返回值。
SeekStart
TOP
beginning of
the log file.
BOTTOM
end
of
the log file.
LAST
start
of
last
command's
output.
CURRENT
current
position.
LineOffset
設置偏移量,正數(shù)為從當前位置向下移動的行數(shù),負數(shù)為從當前位置向上移動的行數(shù)。
用法舉例一:只讀取最后一行的內(nèi)容
logseek(LAST); //將指針移到最后
getline(line); //取得最后一行的內(nèi)容
用法舉例二:讀取N行以后的內(nèi)容
logseek(CURRENT,3); //將指針向下移3行
getline(Line); //取得當前行的內(nèi)容
用法舉例三: 逐行讀取執(zhí)行結(jié)果
getline(line);//取第一行的結(jié)果
while (getline(line)<>0) // 循環(huán)執(zhí)行直到讀取不到內(nèi)容
對變量line值進行分析判斷是否是需要的信息;
logseek(CURRENT,1); //指針下移一行
endwhile
|
四.有些指令在執(zhí)行過程中需要用戶再次確認才可以繼續(xù)執(zhí)行的,這時我們可以利用question和answer這對函數(shù)來實現(xiàn),需要強調(diào)的是question和answer必須成對使用。
語法:
string question(integer index, string question);//其中index是一個整型常量,用于唯一標識這個問題,并且通過index使得question和answer匹配。
string answer(integer index, string answer);
例如:
question(1,"[HBT]--Username: ");
answer(1,strprint("%s\r","JWFJWF"));
//“/r”相當于我們敲一下“ENTER”鍵
question(2,"[HBT]-Password: ");
answer(2,"111111\r");
question(3, "CONFIRM COMMAND EXECUTION: Y/N ?");
answer(3, "Y\r");
|
五.在程序出現(xiàn)編譯錯誤或者執(zhí)行結(jié)果不正確時,如何利用系統(tǒng)工具來調(diào)試程序?
1.程序編譯沒有通過時:可以根據(jù)系統(tǒng)提示,找到不正確的行,一般可能是變量沒有定義便使用的,在hit程序中所有使用的變量都是要先定義后使用的;有些時候,可能系統(tǒng)指出錯誤的行并沒有語法錯誤,而是因為前面一行的語句沒有加分號而導致的錯誤。在hit程序中每條語句都要以分號來結(jié)束。只要正確使用語法都是可以編譯通過的。
2.程序編譯通過但執(zhí)行結(jié)果不正確時:HIT程序執(zhí)行有兩種方式,快速執(zhí)行和交互式執(zhí)行。在交互式這個執(zhí)行方式下,我們可以設置斷點(在要設斷點的行按F5進行設置,去掉斷點也是按F5),然后單步執(zhí)行進行調(diào)試。為了更清楚知道程序執(zhí)行情況,可以增加watch(dubug菜單中add watch),看程序執(zhí)行中變量的值是否正確,從而發(fā)現(xiàn)錯誤之處進行修改。調(diào)試程序是件費時的工作,有時一個小問題可能要花費很長時間才可以查出來,但是只要大家細心檢查程序中核心語句的執(zhí)行結(jié)果,定能發(fā)現(xiàn)錯誤之處。
下面我以一個簡單的例子給出一個完整的MACRO,這個例子實現(xiàn)了在多個網(wǎng)元上修改某一用戶密碼的功能。以后寫其他功能的MACRO時也可以套用這個MACRO,直接在這個MACRO的基礎(chǔ)上修改就可以了。
function main()
integer row_ne,file_excel; //定義需要用到的整型變量
string
name_ne, name_excel, linerecord; //定義需要用到的字符串變量
device("NE_SCAN"); //利用NE_SCAN這個設備來登陸網(wǎng)元
row_ne=2; //從第二行起讀取excel文件中的值,每執(zhí)行一個網(wǎng)元row_ne的值加一;
file_excel=ddeconnect("EXCEL","[修改密碼網(wǎng)元列表.xls]sheet1");// 用file_excel代表excel文件
name_excel=dderequest(file_excel,strprint("R%dC1",row_ne)); /讀/取excel文件中的網(wǎng)元名
strscan(name_excel,"%s",name_ne); //將name_excel的值賦給name_ne,用來記錄當前執(zhí)行的網(wǎng)元
question(2,"ENTER USERNAME <");//以下是程序執(zhí)行中會遇到的需要用戶輸入的地方
answer(2,"JWFJWF\r");
question(3,"ENTER PASSWORD <");
answer(3,"123456\r");
question(4,"OLD PASSWORD:");
answer(4,"123456\r");
question(5,"NEW PASSWORD:");
answer(5,"654321\r");
question(6,"VERIFICATION:");
answer(6,"654321\r");
while (name_ne<>"END") // 在EXCEL中我們以END來表示沒有要執(zhí)行的網(wǎng)元了
question(1,"[HBT]--Device
:"); //由于登陸的網(wǎng)元是變化的所以要放在while循環(huán)中才可
answer(1,strprint("%s\r",name_ne));
Z;
//兩條Z;語句完成退出網(wǎng)元,但是這條語句的位置必須在question&answer語句之后,否則對應"[HBT]--Device
:"這個問題的回答還是剛才執(zhí)行過的網(wǎng)元名,而不是我們新獲取的下一個要執(zhí)行的網(wǎng)元名,大家可以試一下把這條語句放在question&answer語句之前,看看執(zhí)行結(jié)果就明白了
ZIAG:NEWPWT:; //要執(zhí)行的操作,修改此處執(zhí)行的指令就可以實現(xiàn)其他功能
if (getline(linerecord,"'COMMAND EXECUTED'")) //判斷操作成功與否
ddedata(file_excel,strprint("R%dC2",row_ne),"OK");//操作成功以OK標識
endif;
row_ne=row_ne+1;
name_excel=dderequest(file_excel,strprint("R%dC1",row_ne));//讀取下一個要執(zhí)行的網(wǎng)元
strscan(name_excel,"%s",name_ne);
Z;
endwhile
endfunction
|
本文簡單介紹了在HIT上編寫MACRO程序的常用函數(shù)和一些小技巧,希望能給大家提供一些幫助,達到提高我們維護質(zhì)量的目的。同時NOKIA的幫助文檔資源豐富,大家可以參考并相互交流,希望本文可以起到拋磚引玉的作用。
[ 本帖最后由 sayyou 于 2012-4-16 21:01 編輯 ]
2011-5-29 19:20:09 下載次數(shù): 370
MACRO.doc (62 KB)
掃碼關(guān)注5G通信官方公眾號,免費領(lǐng)取以下5G精品資料
1、回復“YD5GAI”免費領(lǐng)取《中國移動:5G網(wǎng)絡AI應用典型場景技術(shù)解決方案白皮書》
2、回復“5G6G”免費領(lǐng)取《5G_6G毫米波測試技術(shù)白皮書-2022_03-21》
3、回復“YD6G”免費領(lǐng)取《中國移動:6G至簡無線接入網(wǎng)白皮書》
4、回復“LTBPS”免費領(lǐng)取《《中國聯(lián)通5G終端白皮書》》
5、回復“ZGDX”免費領(lǐng)取《中國電信5G NTN技術(shù)白皮書》
6、回復“TXSB”免費領(lǐng)取《通信設備安裝工程施工工藝圖解》
7、回復“YDSL”免費領(lǐng)取《中國移動算力并網(wǎng)白皮書》
8、回復“5GX3”免費領(lǐng)取《 R16 23501-g60 5G的系統(tǒng)架構(gòu)1》
共獲得 1 次點評 我要點評
sayyou 威望 +20 個
· 多多來交流啊
詳細..
發(fā)表與:2012-4-16 17:31:08
| |