信不信在 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();
文章评论