aardio + bat 批处理混合编程,制作漂亮图形界面
off999 2024-12-23 12:42 22 浏览 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 调用第三方编程语言示例》。
本文我们主要介绍 aardio + bat 批处理混合编程。
一、aardio + bat 入门
请在 aardio 中点击「主菜单 > 新建工程 > 窗口程序 > 批处理」创建批处理范例工程。
生成的范例初始代码很简单,我们在工程中双击打开程序入口代码 main.aardio ,然后点击运行,运行效果如下:
代码很简单,我们重点说一下启动批处理的关键代码:
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 console
import 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 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:
相关推荐
- 让 Python 代码飙升330倍:从入门到精通的四种性能优化实践
-
花下猫语:性能优化是每个程序员的必修课,但你是否想过,除了更换算法,还有哪些“大招”?这篇文章堪称典范,它将一个普通的函数,通过四套组合拳,硬生生把性能提升了330倍!作者不仅展示了“术”,更传授...
- 7 段不到 50 行的 Python 脚本,解决 7 个真实麻烦:代码、场景与可复制
-
“本文整理自开发者AbdurRahman在Stackademic的真实记录,所有代码均经过最小化删减,确保在50行内即可运行。每段脚本都对应一个日常场景,拿来即用,无需额外依赖。一、在朋...
- Python3.14:终于摆脱了GIL的限制
-
前言Python中最遭人诟病的设计之一就是GIL。GIL(全局解释器锁)是CPython的一个互斥锁,确保任何时刻只有一个线程可以执行Python字节码,这样可以避免多个线程同时操作内部数据结...
- Python Web开发实战:3小时从零搭建个人博客
-
一、为什么选Python做Web开发?Python在Web领域的优势很突出:o开发快:Django、Flask这些框架把常用功能都封装好了,不用重复写代码,能快速把想法变成能用的产品o需求多:行业...
- 图解Python编程:从入门到精通系列教程(附全套速查表)
-
引言本系列教程展开讲解Python编程语言,Python是一门开源免费、通用型的脚本编程语言,它上手简单,功能强大,它也是互联网最热门的编程语言之一。Python生态丰富,库(模块)极其丰富,这使...
- Python 并发编程实战:从基础到实战应用
-
并发编程是提升Python程序效率的关键技能,尤其在处理多任务场景时作用显著。本文将系统介绍Python中主流的并发实现方式,帮助你根据场景选择最优方案。一、多线程编程(threading)核...
- 吴恩达亲自授课,适合初学者的Python编程课程上线
-
吴恩达教授开新课了,还是亲自授课!今天,人工智能著名学者、斯坦福大学教授吴恩达在社交平台X上发帖介绍了一门新课程——AIPythonforBeginners,旨在从头开始讲授Python...
- Python GUI 编程:tkinter 初学者入门指南——Ttk 小部件
-
在本文中,将介绍Tkinter.ttk主题小部件,是常规Tkinter小部件的升级版本。Tkinter有两种小部件:经典小部件、主题小部件。Tkinter于1991年推出了经典小部件,...
- Python turtle模块编程实践教程
-
一、模块概述与核心概念1.1turtle模块简介定义:turtle是Python标准库中的2D绘图模块,基于Logo语言的海龟绘图理念实现。核心原理:坐标系系统:原点(0,0)位于画布中心X轴:向右...
- Python 中的asyncio 编程入门示例-1
-
Python的asyncio库是用于编写并发代码的,它使用async/await语法。它为编写异步程序提供了基础,通过非阻塞调用高效处理I/O密集型操作,适用于涉及网络连接、文件I/O...
- 30天学会Python,开启编程新世界
-
在当今这个数字化无处不在的时代,Python凭借其精炼的语法架构、卓越的性能以及多元化的应用领域,稳坐编程语言排行榜的前列。无论是投身于数据分析、人工智能的探索,还是Web开发的构建,亦或是自动化办公...
- Python基础知识(IO编程)
-
1.文件读写读写文件是Python语言最常见的IO操作。通过数据盘读写文件的功能都是由操作系统提供的,读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个...
- Python零基础到精通,这8个入门技巧让你少走弯路,7天速通编程!
-
Python学习就像玩积木,从最基础的块开始,一步步搭建出复杂的作品。我记得刚开始学Python时也是一头雾水,走了不少弯路。现在回头看,其实掌握几个核心概念,就能快速入门这门编程语言。来聊聊怎么用最...
- 一文带你了解Python Socket 编程
-
大家好,我是皮皮。前言Socket又称为套接字,它是所有网络通信的基础。网络通信其实就是进程间的通信,Socket主要是使用IP地址,协议,端口号来标识一个进程。端口号的范围为0~65535(用户端口...
- Python-面向对象编程入门
-
面向对象编程是一种非常流行的编程范式(programmingparadigm),所谓编程范式就是程序设计的方法论,简单的说就是程序员对程序的认知和理解以及他们编写代码的方式。类和对象面向对象编程:把...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)