aardio 小、輕、快,專注于 Windows 桌面軟件快速開(kāi)發(fā)。在 aardio 中可以調(diào)用很多編程語(yǔ)言,例如 C語(yǔ)言、C 、C#、Java、Python、R、Javascript、Node.Js、Fortran、VB、Flash ActionScript、PHP、VBScript、PowerShell、NewLISP、AutoLISP、Delphi、FreeBASIC、Ruby、Rust、Julia、Nim、Go 語(yǔ)言、批處理 …… 請(qǐng)參考《 aardio 調(diào)用第三方編程語(yǔ)言示例》。
本文我們主要介紹 aardio bat 批處理混合編程。
一、aardio bat 入門
請(qǐng)?jiān)?aardio 中點(diǎn)擊「主菜單 > 新建工程 > 窗口程序 > 批處理」創(chuàng)建批處理范例工程。
生成的范例初始代碼很簡(jiǎn)單,我們?cè)诠こ讨须p擊打開(kāi)程序入口代碼 main.aardio ,然后點(diǎn)擊運(yùn)行,運(yùn)行效果如下:
代碼很簡(jiǎn)單,我們重點(diǎn)說(shuō)一下啟動(dòng)批處理的關(guān)鍵代碼:
var prcs = process.batch("batbat.aardio",{ exepath = io._exepath; //傳遞命名參數(shù) "批處理啟動(dòng)參數(shù)1"; //批處理使用 %1 接收第一個(gè)參數(shù) "批處理啟動(dòng)參數(shù)2"; //批處理使用 %2 接收第一個(gè)參數(shù)})
process.batch() 函數(shù)用于啟動(dòng)批處理,返回一個(gè)進(jìn)程管道對(duì)象。如果需要優(yōu)先執(zhí)行 64 位命令 —— 請(qǐng)改為 process.batch.wow64(),其他用法一樣。
先看參數(shù) @1 指定的 bat 文件路徑參數(shù), aardio 中文件路徑「首字符」可以用一個(gè)單斜桿(或反斜桿)表示應(yīng)用程序根目錄,應(yīng)用程序根目錄在開(kāi)發(fā)時(shí)指工程目錄或工程外獨(dú)立啟動(dòng)的文件所在目錄,發(fā)布后指 EXE 所在目錄。
而 aardio 工程中的目錄可以指定為「內(nèi)嵌資源」,也就是將該目錄下面的文件編譯到 EXE 資源內(nèi)。aardio 中很多文件有關(guān)的函數(shù)都自動(dòng)兼容資源文件,代碼不需要修改,上面的 "batbat.aardio" 就是一個(gè)資源文件。
"batbat.aardio" 的文件后綴改成 *.bat 后綴也是可以的,不過(guò)使用 *.aardio 后綴可以直接在 aardio 中編輯。我們可以右鍵點(diǎn)擊 "batbat.aardio",然后在彈出菜單中點(diǎn)擊「跳轉(zhuǎn)到文件」:
打開(kāi)的批處理代碼如下:
注意綠色部分是批處理代碼,我們可以在批處理中編寫 aardio 代碼,遵守類PHP的 aardio 模板語(yǔ)法即可 —— 也就是將 aardio 代碼置入 <? ?> 模板標(biāo)記就可以了。
aardio將 <? ….. ?> 之外的部分解析為: print("批處理代碼") 以調(diào)用全局函數(shù) print 輸出批處理代碼。print 函數(shù)可以接收多個(gè)參數(shù),每個(gè)參數(shù)都會(huì)自動(dòng)調(diào)用 tostring() 轉(zhuǎn)換為字符串。
可以使用 <?=表達(dá)式?> 輸出文本,該代碼的作用類似于 print( 表達(dá)式 ) , 下面的寫法也是允許的
<?
= 表達(dá)式
?>
我們?cè)倩氐介_(kāi)始,看一下啟動(dòng)該批處理的 aardio 代碼:
var prcs = process.batch("batbat.aardio",{ exepath = io._exepath; //傳遞命名參數(shù) "批處理啟動(dòng)參數(shù)1"; //批處理使用 %1 接收第一個(gè)參數(shù) "批處理啟動(dòng)參數(shù)2"; //批處理使用 %2 接收第一個(gè)參數(shù)})
process.batch() 用于啟動(dòng)批處理,第一個(gè)參數(shù)指定批處理文件( 或者直接指定批處理代碼也可以 ),后面可以用一個(gè)表參數(shù)指定批處理調(diào)用參數(shù):
{ exepath = io._exepath; //傳遞命名參數(shù) "批處理啟動(dòng)參數(shù)1"; //批處理使用 %1 接收第一個(gè)參數(shù) "批處理啟動(dòng)參數(shù)2"; //批處理使用 %2 接收第一個(gè)參數(shù)}
這個(gè)批處理表參數(shù)的數(shù)組成員傳遞為批處理的普通參數(shù) —— 可以在批處理中用 %1, %2 等接收對(duì)應(yīng)參數(shù):
而表參數(shù)中的名值對(duì)成員則傳為 aardio 模板參數(shù),在 "batbat.aardio" 內(nèi)可以用 owner 參數(shù)接收該模板參數(shù),例如該文件內(nèi)可以用 aardio 代碼 owner.exepath 獲取調(diào)用參數(shù) exepth 。
process.batch() 返回一個(gè)進(jìn)程管道對(duì)象 —— 也就是 process.popen 對(duì)象。使用該管道對(duì)象可以方便地讀寫批處理進(jìn)程,獲取返回值,退出代碼等等。更多用法請(qǐng)參考標(biāo)準(zhǔn)庫(kù) process.popen 庫(kù)函數(shù)文檔。
其實(shí)用法很簡(jiǎn)單,例如等待批處理執(zhí)行完成,并返回進(jìn)程輸出:
var out,err = prcs.readAll(); //可在參數(shù) @1 中指定匹配模式查找指定字符串
返回值 out 用于接收批處理的輸出( 包含錯(cuò)誤輸出 ),返回值 err 用于接收批處理的錯(cuò)誤輸出。批處理調(diào)用" EXIT /B 數(shù)值"即可指定退出代碼。
二、aardio 與批處理簡(jiǎn)單對(duì)比
本節(jié)提到的所有源碼來(lái)自 aardio 自帶范例:
下面是一個(gè) aardio 調(diào)用批處理 for 語(yǔ)句的示例:
import consoleimport process.batch;//批處理 for 遍歷并拆分字符串var bat = process.batch(`@echo off for %%i in (abc,def,xyz) do echo %%i`)console.log( prcs.readAll() )console.pause();
下面我們用純 aardio 代碼實(shí)現(xiàn)上面的的功能:循環(huán)遍歷用空格鍵、跳格鍵(tab)、逗號(hào)、分號(hào)或等號(hào)拆分出來(lái)的字符串,aardio 代碼如下:
import console; for( line in string.lines("abc,def,xyz","[s,;=]") ){ console.log(line)} console.pause(true);
上面是一個(gè)典型的 for 循環(huán)語(yǔ)句。string.lines() 用于創(chuàng)建迭代器,string.lines() 的第 @2 個(gè)參數(shù)指定分隔符 —— 支持類正則表達(dá)式的 aardio 模式匹配語(yǔ)法(請(qǐng)參考語(yǔ)法文檔)。注意 aardio 里循環(huán)變量名 line 不需要在前面加%%,也沒(méi)有只能使用26個(gè)字母的限制。
下面我們?cè)倏匆粋€(gè) aardio 調(diào)用批處理 for 語(yǔ)句的例子:
import consoleimport process.batch;//創(chuàng)建一個(gè)測(cè)試文件,雙引號(hào)內(nèi)換行符會(huì)解釋為 'n'string.save("/test.txt","abc,def123,456" )//批處理 for 遍歷并按行拆分字符串var bat = process.batch(`@echo off for /f "usebackq delims=, tokens=1,2" %%i in ("test.txt") do echo %%i,%%j`)/*注意文件路徑如果有空格必須包含在引號(hào)內(nèi)如果要用引號(hào)包含路徑,就必須加上 usebackq,usebackq的意思是用反引號(hào)包含命令,單引號(hào)包含字符串,然后雙引號(hào)就可以包含文件路徑而不是字符串了*/console.log(bat.read(-1)); console.pause()
用純 aardio 代碼這樣寫:
import console//aardio 需要先讀文件到字符串var str = string.load("/test.txt")//參數(shù)@3指定delims,可以用強(qiáng)大的模式匹配語(yǔ)法指定分隔符for tokens in string.lines(str,,",") { /* tokens 是一個(gè)數(shù)組,可以用 string.join 任意拼接數(shù)組中指定范圍的元素實(shí)現(xiàn)批處理 tokens=n-m 的效果 */ console.log(tokens[1],tokens[2])}console.pause()
其實(shí)在 aardio 中還可以 string.each() 實(shí)現(xiàn)類似功能,如下:
for a,b in string.each(str,"([^,] ),(. )"){ console.log(a,b)}
再看一個(gè)例子,aardio 中調(diào)用 for 語(yǔ)句遍歷文件這樣寫:
import console;import process.batch;//批處理 for 遍歷一個(gè)目錄下的所有文件var bat = process.batch(`@for /r "./" %%I in (*) do @echo %%I`)for( all,out,err in bat.each() ){ console.log(all)}console.pause()
改成純 aardio 代碼遍歷文件這樣寫:
import console;/*aardio 遍歷一個(gè)目錄下的所有文件*/import fsys;fsys.enum( "/", "*.*", function(dir,filename,fullpath,findData){ if(filename){ console.log("發(fā)現(xiàn)文件:" filename,"完整路徑:" fullpath) } else{ console.log( "發(fā)現(xiàn)目錄:" dir ) } } ,/*如果此參數(shù)為false則忽略子目錄*/);console.pause()
三、執(zhí)行 CMD 命令與進(jìn)程管道操作
如果我們不需要執(zhí)行 bat 批處理。也可以用 process.popen 直接調(diào)用 cmd.exe 創(chuàng)建進(jìn)程管道。注意 process.batch 同樣是基于 process.popen 調(diào)用 cmd.exe ,對(duì)進(jìn)程管道的操作是一樣的。
批理執(zhí)行 CMD 命令:
import process.popen//打開(kāi)命令行,隱藏命令行窗口var prcs = process.popen.cmd(`CD "C:Program Files"C:dir mkdir testrmdir test`)//顯示結(jié)果import win;win.msgbox(prcs.read(-1))
process.popen 創(chuàng)建的進(jìn)程對(duì)象不會(huì)打開(kāi)黑窗口,而且可以通過(guò)返回的進(jìn)程管道讀寫進(jìn)程標(biāo)準(zhǔn)輸出輸入。當(dāng)然這個(gè)方法不僅僅是可以用于 cmd.exe ,也適用于所有控制臺(tái)程序。
再看一個(gè)讀寫進(jìn)程管道的例子:
import process.popenvar prcs = process.popen("cmd.exe")//如果調(diào)用UTF8編碼的程序,請(qǐng)?zhí)砑酉旅娴木幋a聲明//prcs.codepage = 65001var cmd = /*CD C:C:dir mkdir testrmdir test*/prcs.write(cmd)var result = prcs.peekTo(">");prcs.print('exit')//顯示結(jié)果import console;console.log( result );console.pause("pause");
四、環(huán)境變量
直接看范例:
import win;import process.popen//在父進(jìn)程中指定環(huán)境變量string.setenv("TESTENV","測(cè)試變量值");//打開(kāi)命令行,隱藏命令行窗口var prcs = process.popen.cmd(`echo %TESTENV%`) //也可以在 process 或 process.popen 參數(shù)@3中通過(guò) environment為目標(biāo)進(jìn)程指定環(huán)境變量var prcs = process.popen("cmd.exe","/c echo %TESTENV2%",{ environment = { TESTENV2 = "測(cè)試變量值2" }})import fsys.environment;import process.batch;var prcs = process.batch( `@echo offset TESTENV3=測(cè)試變量值3<? print( fsys.environment.expand("%appdata%") )?>echo %TESTENV3%`)//顯示結(jié)果import win;win.msgbox(prcs.read(-1))
五、發(fā)送 Ctrl C
直接看范例:
import consoleimport process.popenvar prcs = process.popen("ping 127.0.0.1 -n 10 ")for( all,out,err in prcs.each() ){ console.log( out,err ); prcs.ctrlEvent(0);}console.pause();
六、編寫漂亮的界面
aardio 制作圖形界面很方便,請(qǐng)參考 aardio 開(kāi)始頁(yè)的教程《使用 plus 控件制作精美界面》。下面我們看一下 aardio 制作的一些開(kāi)源軟件。
通用輸入法狀態(tài)提示工具 ImTip:
極簡(jiǎn)錄屏工具 Gif123:
系統(tǒng)五筆助手 WubiLex:
版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn),該文觀點(diǎn)僅代表作者本人。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請(qǐng)發(fā)送郵件至 舉報(bào),一經(jīng)查實(shí),本站將立刻刪除。