本文我们紧张先容 aardio + bat 批处理稠浊编程。

一、aardio + bat 入门

请在 aardio 中点击「主菜单 > 新建工程 > 窗口程序 > 批处理」创建批处理范例工程。

天生的范例初始代码很大略,我们在工程中双击打开程序入口代码 main.aardio ,然后点击运行,运行效果如下:

php做界面aardio  bat 批处置混杂编程制造英俊图形界面 HTML

代码很大略,我们重点说一下启动批处理的关键代码:

var prcs = process.batch("\bat\bat.aardio",{ exepath = io._exepath; //通报命名参数 "批处理启动参数1"; //批处理利用 %1 吸收第一个参数 "批处理启动参数2"; //批处理利用 %2 吸收第一个参数})

process.batch() 函数用于启动批处理,返回一个进程管道工具。
如果须要优先实行 64 位命令 —— 请改为 process.batch.wow64(),其他用法一样。

先看参数 @1 指定的 bat 文件路径参数, aardio 中文件路径「首字符」可以用一个单斜杆(或反斜杆)表示运用程序根目录,运用程序根目录在开拓时指工程目录或工程外独立启动的文件所在目录,发布后指 EXE 所在目录。

而 aardio 工程中的目录可以指定为「内嵌资源」,也便是将该目录下面的文件编译到 EXE 资源内。
aardio 中很多文件有关的函数都自动兼容资源文件,代码不须要修正,上面的 "\bat\bat.aardio" 便是一个资源文件。

"\bat\bat.aardio" 的文件后缀改成 .bat 后缀也是可以的,不过利用 .aardio 后缀可以直接在 aardio 中编辑。
我们可以右键点击 "\bat\bat.aardio",然后在弹出菜单中点击「跳转到文件」:

打开的批处理代码如下:

把稳绿色部分是批处理代码,我们可以在批处理中编写 aardio 代码,遵守类PHP的 aardio 模板语法即可 —— 也便是将 aardio 代码置入 <? ?> 模板标记就可以了。

aardio将 <? ..... ?> 之外的部分解析为: print("批处理代码") 以调用全局函数 print 输出批处理代码。
print 函数可以吸收多个参数,每个参数都会自动调用 tostring() 转换为字符串。

可以利用 <?=表达式?> 输出文本,该代码的浸染类似于 print( 表达式 ) , 下面的写法也是许可的<?= 表达式?>

我们再回到开始,看一下启动该批处理的 aardio 代码:

var prcs = process.batch("\bat\bat.aardio",{ exepath = io._exepath; //通报命名参数 "批处理启动参数1"; //批处理利用 %1 吸收第一个参数 "批处理启动参数2"; //批处理利用 %2 吸收第一个参数})

process.batch() 用于启动批处理,第一个参数指定批处理文件( 或者直接指定批处理代码也可以 ),后面可以用一个表参数指定批处理调用参数:

{exepath = io._exepath; //通报命名参数"批处理启动参数1"; //批处理利用 %1 吸收第一个参数"批处理启动参数2"; //批处理利用 %2 吸收第一个参数}

这个批处理表参数的数组成员通报为批处理的普通参数 —— 可以在批处理中用 %1, %2 等吸收对应参数:

而表参数中的名值对成员则传为 aardio 模板参数,在 "\bat\bat.aardio" 内可以用 owner 参数吸收该模板参数,例如该文件内可以用 aardio 代码 owner.exepath 获取调用参数 exepth 。

process.batch() 返回一个进程管道工具 —— 也便是 process.popen 工具。
利用该管道工具可以方便地读写批处理进程,获取返回值,退出代码等等。
更多用法请参考标准库 process.popen 库函数文档。

其实用法很大略,例准期待批处理实行完成,并返回进程输出:

var out,err = prcs.readAll(); //可在参数 @1 中指定匹配模式查找指定字符串

返回值 out 用于吸收批处理的输出( 包含缺点输出 ),返回值 err 用于吸收批处理的缺点输出。
批处理调用" EXIT /B 数值"即可指定退出代码。

二、aardio 与批处理大略比拟

本节提到的所有源码来自 aardio 自带范例:

下面是一个 aardio 调用批处理 for 语句的示例:

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 代码实现上面的的功能:循环遍历用空格键、跳格键(tab)、逗号、分号或等号拆分出来的字符串,aardio 代码如下:

import console; for( line in string.lines("abc,def,xyz","[\s,;=]") ){console.log(line)} console.pause(true);

上面是一个范例的 for 循环语句。
string.lines() 用于创建迭代器,string.lines() 的第 @2 个参数指定分隔符 —— 支持类正则表达式的 aardio 模式匹配语法(请参考语法文档)。
把稳 aardio 里循环变量名 line 不须要在前面加%%,也没有只能利用26个字母的限定。

下面我们再看一个 aardio 调用批处理 for 语句的例子:

import consoleimport process.batch;//创建一个测试文件,双引号内换行符会阐明为 '\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`)/把稳文件路径如果有空格必须包含在引号内如果要用引号包含路径,就必须加上 usebackq,usebackq的意思是用反引号包含命令,单引号包含字符串,然后双引号就可以包含文件路径而不是字符串了/console.log(bat.read(-1)); console.pause()

用纯 aardio 代码这样写:

import console//aardio 须要先读文件到字符串var str = string.load("/test.txt")//参数@3指定delims,可以用强大的模式匹配语法指定分隔符for tokens in string.lines(str,,",") { / tokens 是一个数组,可以用 string.join 任意拼接数组中指定例模的元素实现批处理 tokens=n-m 的效果 /console.log(tokens[1],tokens[2])}console.pause()

其实在 aardio 中还可以 string.each() 实现类似功能,如下:

for a,b in string.each(str,"([^,]+),(.+)"){console.log(a,b)}

再看一个例子,aardio 中调用 for 语句遍历文件这样写:

import console;import process.batch;//批处理 for 遍历一个目录下的所有文件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 遍历一个目录下的所有文件/import fsys;fsys.enum( "/", ".",function(dir,filename,fullpath,findData){ if(filename){ console.log("创造文件:"+filename,"完全路径:"+fullpath)}else{console.log( "创造目录:" + dir )}} ,/如果此参数为false则忽略子目录/);console.pause()三、实行 CMD 命令与进程管道操作

如果我们不须要实行 bat 批处理。
也可以用 process.popen 直接调用 cmd.exe 创建进程管道。
把稳 process.batch 同样是基于 process.popen 调用 cmd.exe ,对进程管道的操作是一样的。

批理实行 CMD 命令:

import process.popen//打开命令行,隐蔽命令行窗口var prcs = process.popen.cmd(`CD "C:\Program Files"C:dir mkdir testrmdir test`)//显示结果import win;win.msgbox(prcs.read(-1))

process.popen 创建的进程工具不会打开黑窗口,而且可以通过返回的进程管道读写进程标准输出输入。
当然这个方法不仅仅是可以用于 cmd.exe ,也适用于所有掌握台程序。

再看一个读写进程管道的例子:

import process.popenvar prcs = process.popen("cmd.exe")//如果调用UTF8编码的程序,请添加下面的编码声明//prcs.codepage = 65001var cmd = /CD C:\C:dir mkdir testrmdir test/prcs.write(cmd)var result = prcs.peekTo(">");prcs.print('exit')//显示结果import console;console.log( result );console.pause("pause");四、环境变量

直接看范例:

import win;import process.popen//在父进程中指定环境变量string.setenv("TESTENV","测试变量值");//打开命令行,隐蔽命令行窗口var prcs = process.popen.cmd(`echo %TESTENV%`) //也可以在 process 或 process.popen 参数@3中通过 environment为目标进程指定环境变量var prcs = process.popen("cmd.exe","/c echo %TESTENV2%",{environment = {TESTENV2 = "测试变量值2"}})import fsys.environment;import process.batch;var prcs = process.batch( `@echo offset TESTENV3=测试变量值3<?print( fsys.environment.expand("%appdata%") )?>echo %TESTENV3%`)//显示结果import win;win.msgbox(prcs.read(-1))五、发送 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 制作图形界面很方便,请参考 aardio 开始页的教程《利用 plus 控件制作精美界面》。
下面我们看一下 aardio 制作的一些开源软件。

通用输入法状态提示工具 ImTip:

极简录屏工具 Gif123:

系统五笔助手 WubiLex: