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();
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()
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))
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))