网易首页 > 网易号 > 正文 申请入驻

aardio + bat 批处理混合编程,制作漂亮图形界面

0
分享至

aardio 小、轻、快,专注于 Windows 桌面软件快速开发。在 aardio 中可以调用很多编程语言,例如 C语言、C++、C#、Java、Python、R、Javascript、Node.Js、Fortran、VB、Flash ActionScript、PHP、VBScript、PowerShell、NewLISP、AutoLISP、Delphi、FreeBASIC、Ruby、Rust、Julia、Nim、Go 语言、批处理 ......

本文我们主要介绍 aardio + bat 批处理混合编程。

一、aardio + bat 入门

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

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

范例源代码如下:

import fonts.fontAwesome;
import win.ui;
/*DSG{{*/
var mainForm = win.form(text="批处理";right=875;bottom=625)
mainForm.add(
btnExecute={cls="plus";text="执行批处理";left=648;top=551;right=820;bottom=596;align="left";bgcolor=-5197169;db=1;dr=1;font=LOGFONT(h=-16);iconStyle={align="left";font=LOGFONT(h=-16;name='FontAwesome');padding={left=20}};iconText='\uF17A';notify=1;textPadding={left=42};z=2};
editResult={cls="edit";left=15;top=13;right=863;bottom=536;db=1;dl=1;dr=1;dt=1;edge=1;hscroll=1;multiline=1;vscroll=1;z=1}
)
/*}}*/
//导入批处理支持
import process.batch;
//点击按钮触发下面的事件
mainForm.btnExecute.oncommand = function(id,event){
var prcs = process.batch("\bat\bat.aardio",{
exepath = io._exepath; //传递命名参数
"批处理启动参数1"; //批处理使用 %1 接收第一个参数
"批处理启动参数2"; //批处理使用 %2 接收第一个参数
})
//禁用按键并显示动画
mainForm.btnExecute.disabledText = {'\uF254';'\uF251';'\uF252';'\uF253';'\uF250';text=''}
/*
out 用于接收批处理的标准输出
err 用于接收批处理的错误输出
exitcode 用于接收批处理进程退出代码,
批处理调用" EXIT /B 数值"即可指定退出代码
*/
var ok,out,err,exitcode = prcs.waitOne()
mainForm.editResult.print(out,err);
prcs.close();
//取消禁用按钮
mainForm.btnExecute.disabledText = null;
}
//设置按钮外观样式
import style;
mainForm.btnExecute.skin(style.primaryButton);
//显示窗口
mainForm.show();
//启动界面消息循环
win.loopMessage();

代码很简单,我们重点说一下上面代码中启动批处理的代码:

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

首先请注意 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 ok,out,err,exitcode = prcs.waitOne()

prcs.waitOne() 的作用是等待进程结束(此函数不卡界面),返回值 out 用于接收批处理的标准输出,返回值 err 用于接收批处理的错误输出,返回值 exitcode 用于接收批处理进程退出代码,批处理调用" EXIT /B 数值"即可指定退出代码。

二、aardio 与批处理简单对比

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

import console
import process.batch;
//批处理 for 遍历并拆分字符串
var bat = process.batch(`
@echo off
for %%i in (abc,def,xyz) do echo %%i
`)
console.log( bat.read(-1) )
console.pause();

上面代码中的 bat.read(-1) 用于直接读取所有批处理进程的标准输出。

下面我们用纯 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 console
import process.batch;
//创建一个测试文件,双引号内换行符会解释为 '\n'
string.save("/test.txt","abc,def
123,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 test
rmdir test
`)
//显示结果
import win;
win.msgbox(prcs.read(-1))

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

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

import process.popen
var prcs = process.popen("cmd.exe")
//如果调用UTF8编码的程序,请添加下面的编码声明
//prcs.codepage = 65001
var cmd = /*
CD C:\
C:
dir
mkdir test
rmdir 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 off
set TESTENV3=测试变量值3 print( fsys.environment.expand("%appdata%") )
?>
echo %TESTENV3%
`)
//显示结果
import win;
win.msgbox(prcs.read(-1))

五、发送 Ctrl + C

直接看范例:

import console
import process.popen
var 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:

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
国足评分出炉!胡荷韬垫底,颜骏凌7.3分居首,替补3人高分

国足评分出炉!胡荷韬垫底,颜骏凌7.3分居首,替补3人高分

奥拜尔
2026-03-31 16:30:46
单依纯舞台上歇斯底里的表演,不停高喊“好想谈恋爱”

单依纯舞台上歇斯底里的表演,不停高喊“好想谈恋爱”

爆角追踪
2026-03-30 07:15:45
韩媒扎心双标!韩国0-4没脸,国足 0-2,9分钟崩盘更没救

韩媒扎心双标!韩国0-4没脸,国足 0-2,9分钟崩盘更没救

侧身凌空斩
2026-03-31 16:35:11
惊讶!伊朗大捷!用一场标志性大胜,让美军创下战后最大战损记录

惊讶!伊朗大捷!用一场标志性大胜,让美军创下战后最大战损记录

军机Talk
2026-03-30 11:02:14
国足闪电丢球!邵时代首次丢球,刘浩帆挨批:注意力不集中

国足闪电丢球!邵时代首次丢球,刘浩帆挨批:注意力不集中

奥拜尔
2026-03-31 14:11:31
NASA宇航员晒了1张照片,网友集体破防:快烧了它

NASA宇航员晒了1张照片,网友集体破防:快烧了它

Ping值焦虑
2026-03-30 14:08:36
45岁宋慧乔看画展,素颜脸肿起褶,留四边齐短发,网友:老了20岁

45岁宋慧乔看画展,素颜脸肿起褶,留四边齐短发,网友:老了20岁

洲洲影视娱评
2026-03-31 16:12:54
中方禁止入境后,不到24小时,古屋圭司说了3句话,态度极其嚣张

中方禁止入境后,不到24小时,古屋圭司说了3句话,态度极其嚣张

策略述
2026-03-31 14:22:48
中印西山口白刃战:印度弯刀对上我军三棱刺,126名印军无一生还

中印西山口白刃战:印度弯刀对上我军三棱刺,126名印军无一生还

棠棣分享
2026-03-22 00:12:09
真不打球了!生涯狂赚2亿,如今疯狂钓鱼,妥妥的人生大赢家啊

真不打球了!生涯狂赚2亿,如今疯狂钓鱼,妥妥的人生大赢家啊

球童无忌
2026-03-30 14:39:34
毕节一副局长被曝曾公开在微博宣布自己不是中国人

毕节一副局长被曝曾公开在微博宣布自己不是中国人

映射生活的身影
2026-03-31 02:04:09
被非洲强队震撼?U23国足队长:他们补时还能跑!每分钟都是收获

被非洲强队震撼?U23国足队长:他们补时还能跑!每分钟都是收获

我爱英超
2026-03-31 17:44:00
广州暴雨:高架桥秒变"高架河",司机吐槽"开车如开船"

广州暴雨:高架桥秒变"高架河",司机吐槽"开车如开船"

大道微言
2026-03-31 08:20:47
翻到张雪峰2016年婚纱照,瞬间看哭了!

翻到张雪峰2016年婚纱照,瞬间看哭了!

魔都姐姐杂谈
2026-03-26 22:06:50
被裁!精神异常+疯言疯语!天才5号秀彻底玩完了...

被裁!精神异常+疯言疯语!天才5号秀彻底玩完了...

柚子说球
2026-03-31 09:26:33
10万亿窟窿!比恒大更坑的民企来了,曾力压许家印,位居第一

10万亿窟窿!比恒大更坑的民企来了,曾力压许家印,位居第一

孤单是寂寞的毒
2026-03-04 15:38:03
去世仅过去10个月,52岁辛柏青高调传出喜讯 朱媛媛终于可以放心

去世仅过去10个月,52岁辛柏青高调传出喜讯 朱媛媛终于可以放心

小兰聊历史
2026-03-31 15:33:40
寿命与大便次数有关?研究发现:寿命长的人,每天排便在这个次数

寿命与大便次数有关?研究发现:寿命长的人,每天排便在这个次数

DrX说
2025-10-24 14:15:19
张凌赫央视素颜曝光,颜值竟然杀疯!这个神颜也藏不住了!

张凌赫央视素颜曝光,颜值竟然杀疯!这个神颜也藏不住了!

TVB的四小花
2026-03-31 09:57:58
直到看见蒋万安给儿子们起的名字,就知道他骨子里的身份瞒不住

直到看见蒋万安给儿子们起的名字,就知道他骨子里的身份瞒不住

历史人文2
2026-02-23 10:29:02
2026-03-31 21:28:49
aardio
aardio
aardio 编程语言
6文章数 30关注度
往期回顾 全部

科技要闻

华为2025年销售收入8809亿,净利润680亿元

头条要闻

骑张雪机车夺冠的"边缘人" 告别主流摩托赛事长达10年

头条要闻

骑张雪机车夺冠的"边缘人" 告别主流摩托赛事长达10年

体育要闻

县城修车工,用20年成为世界冠军

娱乐要闻

《月鳞绮纪》空降 鞠婧祎却被举报偷税

财经要闻

油价暴涨 我们的生活成本会飙升多少?

汽车要闻

腾势Z9GT到底GT在哪?

态度原创

时尚
本地
健康
手机
游戏

春天别总傻傻的穿一身黑,试试白色配彩色,高级养眼又减龄

本地新闻

用Color Walk的方式解锁城市春日

干细胞抗衰4大误区,90%的人都中招

手机要闻

vivo专访:更清晰的定位,值得更高期待

Steam褒贬不一3A续作发售窗口泄露!开发者意外曝光

无障碍浏览 进入关怀版