信不信在 PowerShell 中可以自由调用 aardio 对象与函数,并且不需要任何复杂的代码?!aardio 现在已经支持这种玩法了,不废话直接看代码:
var ps1 = /*
# 定义命名参数
param($win,$external,$username)
# 自由调用参数传进来的 aardio 对象
$win.msgboxTest("这是 PowerShell 调用 aardio 打开的对话框。") #返回值会自动输出一行
# 自由调用 aardio 函数
$external.func("参数1","参数2")
*/
import win;
import dotNet.ps;
var output = dotNet.ps(ps1,{
win = win; //参数名前不要加$或-
external = {
func = function(title,text){
win.msgbox(text,title)
}
};
});
非常神奇,你可以在 PowerShell 里任意调用 aardio 对象、aardio 函数。不需要写任何复杂的代码。
dotNet.ps(script,param) 的第 @1 参数是 PowerShell 脚本,第 @2 个参数是调用该脚本的参数,这个参数可以是一个表对象,参数表中的名值对 —— 就是指定 PowerShell 的命名参数。数组表中的数组成员 —— 就是匿名参数。
匿名参数示例:
var ps1 = /*
for ( $i=0; $i -lt $args.count; $i++){
write-host $args[$i]
}
*/
import dotNet.ps;
var output = dotNet.ps(ps1,{
"匿名参数1","匿名参数2","匿名参数3","匿名参数4"
});
import console;
console.log(output);
console.pause();
匿名参数也可以这样写:
dotNet.ps(ps1,"匿名参数1","匿名参数2","匿名参数3","匿名参数4");
如果要执行命令也可以使用 dotNet.ps.command() 函数,传参数的方法与使用 dotNet.ps 一模一样,示例:
import dotNet.ps;
var output = dotNet.ps.command("Get-Command",{Name="*Process"});
import console;
console.logPause(output);
默认 PowerShell 中的输出 —— 例如用 Write-Host, Write-Output 输出的内容都会被自动捕获,并在函数返回值中返回。也可以指定回调函数接收 PowerShell 输出数据,示例:
import console;
import dotNet.ps;
dotNet.ps.onWrite = function(str){
console.log(str)
}
dotNet.ps.command("Get-Command",{Name="*Process"});
console.pause(output);
另外我们也可以指定 dotNet.ps.onWriteProgress 回调以自定义 PowerShell 进度条,一个例子:
源码在这里:
aardio 自带范例 / 调用其他语言 / PowerShell / 进度条
上面范例里有一些方便的小工具,例如系统默认是禁止 PowerShell 执行的,当然在 aaradio 里执行 PowerShell 脚本不会受限,这个限制指的是不能在 aardio 外面单独运行 *.ps1 脚本文件,我在范例里就提供了一个小工具 —— 可以一键开启或关闭这个权限:
脚本通常比较敏感 ,不象 EXE 虽然表面看起来误报多一点 —— 但检测过白也不是很难。然而脚本的一些功能被禁这基本是无解的事。
如果不想修改系统权限设置,aardio 提供了一个函数可以直接运行 ps1 脚本,示例:
import process.popen;
var ps1 = process.popen.ps1("/test.ps1");
ps1.readAll()
PowerShell 里有很多 Cmdlet 是用 C# 写的,而 C# 写的软件可以用 ILSpy 直接查看源码。其实看看一些 Cmdlet 的源码很有意思,但这个操作步骤有些多,我也写了一个小工具,可以直接列出所有命令,可以搜索查询,可以一键调用 ILSpy 反编译出源代码:
再发一个调用 process.popen 创建进程管道执行 PowerShell 命令的例子:
import console;
import process.popen;
console.showLoading(" 请稍候,正在调用 PowerShell");
var prcs = process.popen.ps(`-Command "& {Get-Command -Name *Process}"`);
var result = prcs.readAll();
console.log(result);
console.pause();
文章评论