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

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

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 调用第三方编程语言示例》。

本文我们主要介绍 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=’ ‘;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(“batbat.aardio”,{exepath = io._exepath; //传递命名参数”批处理启动参数1″; //批处理使用 %1 接收第一个参数”批处理启动参数2″; //批处理使用 %2 接收第一个参数})//禁用按键并显示动画mainForm.btnExecute.disabledText = {‘ ‘;’ ‘;’ ‘;’ ‘;’ ‘;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(“batbat.aardio”,{ exepath = io._exepath; //传递命名参数 “批处理启动参数1”; //批处理使用 %1 接收第一个参数 “批处理启动参数2”; //批处理使用 %2 接收第一个参数})

首先请注意 aardio 中文件路径「首字符」可以用一个单斜杆(或反斜杆)表示应用程序根目录,应用程序根目录在开发时指工程目录或工程外独立启动的文件所在目录,发布后指 EXE 所在目录。

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

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

打开的批处理代码如下:

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

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

可以使用 输出文本,该代码的作用类似于 print( 表达式 ) , 下面的写法也是允许的

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

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

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

{exepath = io._exepath; //传递命名参数”批处理启动参数1″; //批处理使用 %1 接收第一个参数”批处理启动参数2″; //批处理使用 %2 接收第一个参数}

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

而表参数中的名值对成员则传为 aardio 模板参数,在 “batbat.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 consoleimport 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 consoleimport process.batch;//创建一个测试文件,双引号内换行符会解释为 ”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=测试变量值3echo %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:

郑重声明:本文内容及图片均整理自互联网,不代表本站立场,版权归原作者所有,如有侵权请联系管理员(admin#wlmqw.com)删除。
(0)
用户投稿
上一篇 2022年8月8日
下一篇 2022年8月8日

相关推荐

  • 章子怡最新全家福!大女儿近照太漂亮,换造型大抢章子怡的风头

    不久前正好是汪峰51岁的生日,他也在自己的社交平台上晒出了全家人的合照,而照片上的章子怡素颜出镜,状态依旧很出色,醒醒看上去也长大了不少,身穿白色裙装被爸爸抱着太可爱了。 最让大家…

    2022年7月3日
  • 干部教育专业能力培训课题-数字经济

    《“十四五”数字经济发展规划》解读 《逆全球化形势下的中国经济前景》 《双循环背景下的数字化转型趋势》 《“智能制造”背景下企业数字化转型趋势与发展》 《传统企业数字化转型的逻辑重…

    2022年8月1日
  • 公司电脑不让用IM工具聊天?50行代码写个聊天室

    作者:小K 来源:麦叔编程 “ 今天教大家写个聊天室功能,该程序只有几十行代码,这比动辄几百兆的通讯软件包来说简直就是“神纯净版本”。而且关闭解释环境之后是不会留下任何信息痕迹的,…

    2022年6月21日
  • mybatis : 静态代理 + jdk动态代理

    背景 有时目标对象不可直接访问,只能通过代理对象访问 图示: 示例1:房东 ===> 目标对象房屋中介 ===> 代理对象你,我 ===> 客户端对象 示例2:运…

    2022年8月11日
  • 「Scala语言」(一)理论基础

    本文仅仅只是个人学习的笔记,不代表一定就是对的,仅供参考。 1、计算机语言可以分为两大类:编译型,解释型。 (1)编译型的代表是C语言。 (2)解释型的代表为Python语言。 (…

    2022年6月18日
  • RBB的连线算法-第二道作业题

    至文章《顶底分型的趋势算法定义》结束,包含了已经完成了的顶底分型的四个基本元素的算法定义,如果《算法背后的价值》算是第一道题,今天继续做第二道作业。 网友留言: “老师!给我一个底…

    2022年6月13日
  • win10怎么打开隐藏文件夹(电脑隐藏文件夹如何把它显示出来)

    可能每个人的电脑都会有隐藏文件保存在里面,那么如何把它们显示出来呢?方法很简单,也很容易就能学会,下面来看看详细的操作步骤吧。 系统:win10专业版 电脑:联想YOGA 710-…

    2022年4月20日
  • 网络和共享中心在哪里打开(如何设置共享文件夹密码权限)

    在公司中,我们通常会需要把一些共享的文件放到共享盘中,需要这些文件的同事就可以直接在共享盘里面把文件复制到自己的电脑,这样我们就不需要每个人都通过微信或QQ去发送,那么这个共享文件…

    2022年4月18日
  • iso文件怎么打开win7(电脑打开iso文件的2种方法)

    iso文件又叫光盘镜像文件,主要用于装系统和安装一些大型游戏,比如我们在网上下载的win7,win8系统都是以iso文件形式的。这是由于iso文件就是光盘里面的文件格式,所以我们也…

    2022年5月6日
  • 长大的童星-宋祖儿

    宋祖儿 ,小名涓涓,1998年05月出生于天津,中国当代95后童星、女演员,是演员舒畅的表妹。2005年,出演电视剧《青城之恋》,开始涉足影视圈。 当然我们最熟悉的应该是古装神话剧…

    2022年7月15日

联系我们

联系邮箱:admin#wlmqw.com
工作时间:周一至周五,10:30-18:30,节假日休息