PowerShell 系列神奇新玩法

2022年3月11日 356点热度 0人点赞 0条评论

信不信在 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();

76880PowerShell 系列神奇新玩法

这个人很懒,什么都没留下

文章评论