aardio + PowerShell 可视化快速开发桌面程序,一键生成独立 EXE(powershell运行桌面文件)

aardio 可以方便地调用 PowerShell ,PowerShell 中也可以自由调用 aardio 对象与函数。不用带上体积很大的 System.Management.Automation.dll,直接调用系统组件,可以生成体积很小的独立 EXE。向下兼容到 .NET 2.0、PowerShell 2.0,支持 Win7,Win8Win10Win11 ……

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 可视化快速开发桌面程序,一键生成独立 EXE(powershell运行桌面文件)

这个进度条范例的源码在这里:
aardio 自带范例 / 调用其他语言 / PowerShell / 进度条

aardio + PowerShell 可视化快速开发桌面程序,一键生成独立 EXE(powershell运行桌面文件)

上面范例里有一些方便的小工具,例如操作系统默认禁止单独运行 *.ps1 脚本文件。上面范例里就提供了一个小工具 —— 可以一键开启或关闭这个权限:

aardio + PowerShell 可视化快速开发桌面程序,一键生成独立 EXE(powershell运行桌面文件)

PowerShell 里有很多 Cmdlet 是用 C# 写的,而 C# 写的软件可以用 ILSpy 直接查看源码。其实看看一些 Cmdlet 的源码很有意思,但这个操作步骤有些多。

aardio 自带的 PowerShell 范例里还提供了一个快速查看 Cmdlet 源码的工具,可以直接列出所有命令,可以搜索查询,可以一键调用 ILSpy 反编译出源代码:

aardio + PowerShell 可视化快速开发桌面程序,一键生成独立 EXE(powershell运行桌面文件)

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 consoleconsole.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#、JavaPython、R、Javascript、Node.Js、FortranVB、Flash ActionScript、PHP、VBScript、PowerShell、NewLISP、AutoLISPDelphiFreeBASICRuby、Rust、Julia、Nim、Go 语言、批处理 …… 甚至可以直接嵌入汇编机器码并且转换为普通的 aardio 函数。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

(0)
上一篇 2023年4月20日 上午9:52
下一篇 2023年4月20日 上午10:08

相关推荐

  • 科研项目管理财务管理工作总结

    科研项目管理财务管理工作总结 随着科技的发展和全球化的加速,科研项目管理财务管理已经成为科学研究的重要一环。在过去的几年中,我们团队一直致力于科研项目的管理财务管理工作,以下是我们…

    科研百科 2024年8月12日
    27
  • 腾讯低代码开发平台数据查询

    腾讯低代码开发平台数据查询是一种快速、高效的数据查询工具,它能够帮助开发者在开发过程中更加便捷地获取和分析数据。腾讯低代码开发平台是腾讯公司推出的一款面向企业级应用开发的开发工具,…

    科研百科 2024年3月5日
    65
  • 大型项目管理

    大型项目管理:挑战与机遇 大型项目管理是指涉及众多人员和资源的大型项目,通常需要在短时间内完成。这种项目往往具有高风险和高复杂性,因此需要高度专业的项目管理技能和经验。在大型项目管…

    科研百科 2024年7月24日
    44
  • 深度解析《指引2.0》管理筑基——多维洞察研发项目管理流程

    近年来,研发费用加计扣除政策持续优化完善。为帮助企业更好地理解和应用研发费用加计扣除政策,鼓励企业增加研发投入,促进科技创新,国家税务总局所得税司联合科技部政策法规与创新体系建设司…

    科研百科 2024年1月15日
    82
  • 项目管理跟踪工具

    项目管理跟踪工具 项目管理是许多组织中非常重要的一项任务,因为它可以帮助组织有效地规划,跟踪和控制项目进度和质量。随着技术的不断发展,项目管理跟踪工具也在不断地演变和改进,以满足组…

    科研百科 1天前
    3
  • 如何打破连锁经营企业费用管理难题,助力门店走向全国?(连锁企业门店降低运营成本的途径有)

    无论是巷子口开面馆儿的王大爷,还是公司写字楼底商做皮肤美容管理会所的linda,面对“事业的终极梦想”这个话题,他们的答案可能都是——“把连锁店开遍全国。” 在餐饮、口腔、美业、宠…

    2022年7月24日
    126
  • 项目管理各阶段文档

    项目管理各阶段文档 在项目管理中,每个阶段都是至关重要的,每个阶段都需要详细的文档来记录和控制项目的进展。本文将介绍项目管理各阶段文档的重要性以及如何编写相应的文档。 一、项目启动…

    科研百科 2024年5月27日
    58
  • 最新进度计划

    最新进度计划 随着我们团队的不断发展,最新的进度计划已经出台。这一计划旨在确保我们的工作能够按时完成,并能够满足客户和公司的期望。 在这个计划中,我们将更加注重细节和精度。我们将审…

    科研百科 2024年5月25日
    49
  • 从零开始学Qt – 13:一文读懂Qt项目管理文件(qt项目配置 构建与运行)

    默认情况下,每个Qt项目都包含一个后缀名为.pro、名称和项目名相同的文件,我们通常称它为项目管理文件或者工程管理文件(简称项目文件)。 项目文件包含由qmake构建应用程序、库或…

    科研百科 2022年10月21日
    526
  • 装修工程进度管理

    装修工程进度管理 装修工程是许多人家中需要进行的一项常见工程,无论是新房还是旧房装修,都需要进行计划和管理,以确保工程的顺利进行和最终的成果。装修工程进度管理是一个非常重要的问题,…

    科研百科 4天前
    10