aardio + PowerShell 可视化快速开发独立 EXE 桌面程序
aardio 可以方便地调用 PowerShell ,PowerShell 中也可以自由调用 aardio 对象与函数。不用带上体积很大的
System.Management.Automation.dll,直接调用系统组件,可以生成体积很小的独立 EXE。向下兼容到 .NET 2.0、PowerShell 2.0,支持 Win7,Win8,Win10,Win11 ……
dotNet.ps 扩展库
aardio 调用 PowerShelll 的功能由基于 dotNet 库 实现的 dotNet.ps 库提供。请参考:aardio + .NET 快速开发独立 EXE 程序,可防 ILSpy 反编译。
aardio 调用 PowerShell 命令
我们直接上代码看示例:
import console;
import dotNet.ps; console.showLoading(" 正在执行PowerShell命令");
console.log(
dotNet.ps.command("Get-Command",{"ListImported"})
); console.pause();
dotNet.ps.command 的第一个参数指定要调用的 PowerShell 命令名,第二个参数用一个表对象指定 PowerShell 命令参数 —— 可以包含仅由参数名字组成的数组成员。
参数表也可以包含由名值对指定的命名参数,例如:
dotNet.ps.command("Get-Command"
,{Name="*Process"} );
要注意参数名前面不需要加 $ 或 - 前缀。
等号前面是参数名(必须是字符串),等号后面是参数值(可传入 .NET 对象、COM 对象、aardio 对象)。
aardio 调用 PowerShell 脚本
使用匿名参数调用 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");
也可以指定命名参数,如下:
var ps1 = /*
# 定义命名参数,参数前加$号,aardio 参数表里去掉$号
param($username,$password) Write-host $username,$password
*/ import dotNet.ps;
var output = dotNet.ps(ps1,{
username = "名字";//参数名前不要加$
password = "密码";//参数名前不要加$
}); import console;
console.log(output);
console.pause();
这里请注意:
1、PowerShell 通常用 param 声明参数名称(函数里也可以这样写)。
2、PowerShell 要在变量(或参数名)前加上 $ 符号,在 aardio 中指定 PowerShell 参数时要去掉这个 $ 符号。
dotNet.ps() , dotNet.ps.command() 的传参数规则是完全一样的。
PowerShell 调用 aardio 对象
下面就要进入最神奇的部分了,在 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)
}
};
});
Win10 / Win11 自带的 PowerShell 5.1 可以支持这种舒服的写法。如果要兼容 Win7 只要简单地调用 dotNet.ps.export( aardio对象 ) 导出参数给 PowerShell 就可以了,不过 Win7 的市场份额已经很小,这种事太追求完美也不好。
用 JSON 解析 PowerShell 输出
aardio 代码示例:
import console;
import dotNet.ps; var psVersion = dotNet.ps.json(
`ConvertTo-Json $PSVersionTable.PSVersion`)
console.dumpJson(psVersion); console.pause(true);
捕获 PowerShell 输出
很简单,我们直接看 aardio 代码示例:
import console;
import dotNet.ps; // PowerShell 输入都会传给这个 aardio 函数
dotNet.ps.onWrite = function(str){
console.log(str);
} dotNet.ps.command("Get-Command",{Name="*Process"});
console.pause(output);
我们也可以指定 dotNet.ps.onWriteProgress 回调以自定义 PowerShell 进度条,一个例子:
这个进度条范例的源码在这里:
aardio 自带范例 / 调用其他语言 / PowerShell / 进度条
上面范例里有一些方便的小工具,例如操作系统默认禁止单独运行 *.ps1 脚本文件。上面范例里就提供了一个小工具 —— 可以一键开启或关闭这个权限:
PowerShell 里有很多 Cmdlet 是用 C# 写的,而 C# 写的软件可以用 ILSpy 直接查看源码。其实看看一些 Cmdlet 的源码很有意思,但这个操作步骤有些多。
aardio 自带的 PowerShell 范例里还提供了一个快速查看 Cmdlet 源码的工具,可以直接列出所有命令,可以搜索查询,可以一键调用 ILSpy 反编译出源代码:
aardio / PowerShell / .NET 共享应用程序域
用大白话讲就是这三者可以直接共享对象,相互调用对象非常方便。
当使用 dotNet.ps 运行 PowerShell 代码是在当前进程中运行( 没有创建新进程,但创建了新线程),并且 PowerShell 就运行在 aardio 创建的 .NET 应用程序域中 —— 这时候 aardio / PowerShell / .NET 共享一个应用程序域,这让我们可以做一些有趣的事。
请看 aardio 代码示例:
import dotNet.ps;
import dotNet.json; var json = dotNet.ps( `
# 哈希表(数组元素要用逗号分开)
$tab = @{ Name = "张三"; Age = "20"; Array = 1,2,3 } # PowerShell 类型放在 [] 里面,并用 :: 访问类的静态成员
[Newtonsoft.Json.JsonConvert]::SerializeObject( $tab )
` );
var tab = web.json.parse(json); import console
console.dump(tab)
console.pause()
aardio 库 dotNet.json 内存加载了 .NET 程序集 Newtonsoft.Json.dll,然后我们在 .NET 或是 PowerShell 中就可以直接使用这个程序集导入的类。
注意:PowerShell 将类或类型放在 [中括号] 内,PowerShell 在声明或强制转换类型时都使用这个 [中括号] ,访问类的静态成员使用 :: 而不是圆点 。
下面的例子更进一步:在 aardio 中编译 C# 代码,然后在 PowerShell 中调用该 C# 代码引入的类,然后在 C# 中回调 PowerShell 函数,然后在该 PowerShell 函数中回调 aardio 函数:
import win;
import console;
import dotNet.ps; var compiler = dotNet.createCompiler("C#");
compiler.Source = /******
namespace CSharpLibrary
{
public class Object
{
public delegate int TestDelegateType(string str,int a);
public event TestDelegateType onTestEvent; public int Test()
{
return onTestEvent("你好",123);
} public static Object New(){return new Object(); }
}
}
******/ //编译 C# 代码并导入名字空间
compiler.import("CSharpLibrary"); var out,err = dotNet.ps( `
param($win) $obj = [CSharpLibrary.Object]::New() #创建对象 # 添加事件
$obj.add_onTestEvent( {
param($str,$a) # 声明参数 # 调用 aardio 函数
$temp = $win.msgbox("事件被回调了",$str) # return 语句只能改最后一个返回值,与其他语言有较大区别
return $a
}) $obj.Test()
`,{ win = win; }); console.log(out,err);
console.pause(true);
这里就要注意 PowerShell 有一个非常特别的『 特(大)性(坑)』—— PowerShell 的函数里每句代码的默认输入都会增加一个返回值,例如您执行下面的 PowerShell 代码:
# 添加事件
$obj.add_onTestEvent( {
param($str,$a) $win.msgbox("事件被回调了",$str) return $a
})
这里的返回值实际上有两个,一个是 $win.msgbox() 返回的 object,另一个是 return 返回的 $a,最终返回值是一个数组。然后就会报返回值与 C# 委托回调的返回值类型不匹配。
避免上面这个问题也很简单,把代码放到一个赋值语句里就不会增加返回值了,正确写法:
$temp = $win.msgbox("事件被回调了",$str)
创建管道调用 PowerShell.exe
我们还可以用 aardio 中的 procee.popen 创建进程管道,这样就可以读写 PowerShell.exe 的输出输入,并且隐藏黑窗口。
下面是一个例子:
import console;
import process.popen;
console.showLoading(" 请稍候,正在调用 PowerShell"); var prcs = process.popen.ps(`-Command`,`&{
function Get-Version {
ConvertTo-Json( $PSVersionTable.PSVersion )
} Get-Version
}`); //读取进程输出
var json = prcs.readAll(); //解析返回的 JSON
import web.json;
var psVersion = web.json.parse(json); console.dump(psVersion);
console.pause();
这里要注意,PowerShell 会将仅用大括号包含的 PowerShell 作为字符串输出,在前面加上一个 & 字符才会执行该语句块。
调用更多编程语言
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 + PowerShell 可视化快速开发独立 EXE 桌面程序的更多相关文章
- aardio + PHP 可视化快速开发独立 EXE 桌面程序
aardio 支持与很多编程语言混合开发.网络上大家分享的 aardio + Python 混合开发的文章很多,aardio + PHP 的文章却很少. 其实 aardio 与 PHP 混合开发是真的 ...
- aardio + Python 可视化快速开发桌面程序,一键生成独立 EXE
网络上大家分享的 aardio + Python 混合开发的文章很多,不得不说 aardio 与 Python 混合开发是真的简单 ! 快速入门 推荐几个快速上手教程:< aardio + P ...
- aardio + .NET 快速开发独立 EXE 程序,可防 ILSpy 反编译
简介 aardio 可以非常方便地调用 .NET( 不需要任何复杂的步骤 ). .NET 在 aardio 中很好用,系统自带 .NET 组件以及各种开源 .NET 组件在 aardio 用户中也很受 ...
- 放弃 Electron,拥抱 WebView2!JavaScript 快速开发独立 EXE 程序
Electron 不错,但也不是完美的. Electron 带来了很多优秀的桌面软件,但并不一定总是适合我们的需求. 多个选择总是好事! 我使用 Electron 遇到的一些麻烦 1.Electron ...
- 实用 | 利用 aardio 配合 Python 快速开发桌面应用
1. 前言 大家好,我是安果! 我们都知道 Python 可以用来开发桌面应用,一旦功能开发完成,最后打包的可执行文件体积大,并且使用 Python 开发桌面应用周期相对较长 假如想快速开发一款 PC ...
- 关于电脑开机不出现桌面即不启动explorer.exe桌面程序--------正解
针对这个问题,一开始的思路是,把自己写的界面小程序(Win.exe)放在Windows启动文件夹中, 效果到是界面程序自启动了,但是还是先出现的桌面,然后才的启动的界面程序(Win.exe),并不是我 ...
- Tkinter开发第一个桌面程序HelloWorld
在Python3中是tkinter,Python2中是Tkinter Tkinter是Python 官方承认的标准 GUI 方案(de-facto standard),因为是Python自带安装,决定 ...
- Java 快速开发平台 WB 6.8 发布
WebBuilder是一款开源的可视化Web应用开发和运行平台. 基于浏览器的集成开发环境,采用可视化的设计模式,支持控件的拖拽操作,能轻松完成前后台应用开发: 高效.稳定和可扩展的特点,适合复杂企业 ...
- 使用.NET Core快速开发一个较正规的命令行应用程序
程序员的世界,命令行工具一直是"体验非常友好"的工具,也能自动化完成很多事情,同时还能结合shell来进行某项任务的批处理(脚本).在.NET Core中,命令行应用程序是基础,但 ...
随机推荐
- win10搜索功能用不了
这玩意搞了我今天,直接裂开!系统更新根本解决不了 好在查了相关资料才知道,原来微软在 Win10 的更新中,将搜索功能和语音助手 Cortana 进行了拆分,搜索成了一个独立的功能,还好有外媒发现问题 ...
- 基于cornerstone.js的dicom医学影像查看浏览功能
最近由于项目需求,需要医学影像.dcm文件的预览功能,功能完成后,基于原生Demo做一个开源分享. 心急的小伙伴可以先看如下基于原生js的全部代码: 一.全部代码 <!DOCTYPE html& ...
- python开发环境配置(Windows)
简介 由于在搭建pyhon开发环境时会出现各种各样的问题,因此将这些问题记录下来 1.下载python 从官网下载对应系统的python版本(最新稳定版即可):官网地址为:python下载地址, 建议 ...
- Linux学习系列--用户(组)新增、查看和删除
在实际的工作中,在接触Linux的用户组管理的时候,一般来说都是在系统开建设的时候设置好,root权限由特定的负责人保管用户密码,避免误操作带来不必要的麻烦. 在具体使用的时候,会利用相关的命令设置一 ...
- 干货分享:小技巧大用处之Bean管理类工厂多种实现方式
前言:最近几个月很忙,都没有时间写文章了,今天周末刚好忙完下班相对早点(20:00下班)就在家把之前想总结的知识点写出来,于是就有了这篇文章.虽无很高深的技术,但小技巧有大用处. 有时我们经常需要将实 ...
- Odoo14 ir.rule 中的domain查询语句
# ir.rule 中的domain查询语句 # 当你的字段是many2one.many2many.one2many的时候domain都会强制加上过滤域 # tree显示的时候也会过滤 # m.mod ...
- Linux系列之重定向操作
前言 I/O重定向允许我们将命令的输入和输出重定向到文件中,以及将多个命令连接到一起成为管道.本文就来介绍有关重定向的知识. 标准输入.输出.错误 输出包括两种类型: 程序的结果.被称为标准输出或者s ...
- 越折腾越好用的 3 款开源 APP
高中的时候我特别喜欢捣鼓手机,然后我一个哥们儿在我的强烈推荐下买了个 HTC Dream(G1) 手机. G1 作为谷歌的第一个亲儿子,它出厂搭载的是 Android 1.5 系统,但当时已经出到了 ...
- Apache DolphinScheduler 1.2.0 task 任务存储结构说明
本文章经授权转载 Table of Contents 任务总体存储 Shell节点 SQL节点 存储过程节点 SPARK节点 MapReduce(MR)节点 Python节点 Flink节点 HTTP ...
- java学习第七天lo流.day17
lo输入