# aardio 范例: PowerShell 使用 InvokeMember 回调 aardio



```aardio
//PowerShell 使用 InvokeMember 回调 aardio
import win;
import console; 
console.showLoading(" 正在执行 PowerShell 命令");

/*
aardio 调用 PowerShell 教程: https://mp.weixin.qq.com/s/Sr4HNkOJ1mmAj_V52v69IA
PowerShell 快速入门 https://learnxinyminutes.com/docs/zh-cn/powershell-cn/ 

Win10/Win11 自带的 PowerShell 5.1 已经可以直接回调参数中的 aardio 对象。
如果希望兼容到 Win7 自带的 PowerShell 2.0，则可用 dotNet.ps.export() 导出 aardio 对象到 PowerShell 。

只要简洁，不求完美！
Win7 在市场上已经接近消失，现在开发软件再处处考虑 Win7 兼容是不必要的。
*/
import dotNet.ps;

//PowerShell 脚本代码
var pScript = /* 
	# 定义命名参数，参数前加$号，aardio 参数表里去掉$号
	param($win,$external,$username)
		
	# 使用 InvokeMember 调用参数传进来的 aardio 对象，参数 @1 指定成员函数名
	$win.InvokeMember("msgboxTest","这是 PowerShell 调用 aardio 打开的对话框。") #返回值会自动输出一行
	
	# 可以直接读写属性，这里用下标也可以
	$external.abc = 123
	
	# 自由调用 aardio 函数 
	$external.InvokeMember("func","参数1","参数2")
	
	# 遍历所有匿名参数，有名字的参数这里不输出
	for ( $i=0; $i -lt $args.count; $i++){
		#write-host $args[$i]
	}
		
	Write-Host ("username: " + $username[0])
	Write-Output "测试输出" 
	
	$PSVersionTable.PSVersion
*/

var output,err = dotNet.ps(pScript,{
	//等号前面是参数名（必须是字符串），等号后面是参数值（可传入 .Net 对象、COM 对象、aardio 对象）
	win = dotNet.ps.export(win); //参数名前不要加$或- 
	external = dotNet.ps.export({
		func = function(...){
			console.log("PowerShell 调用 aardio，参数：",...)  
			console.dump(owner)
		}
	}); 
	username = {"测试名字"};//不需要回调成员函数的普通数组，不需要用 dotNet.ps.export 转换。
	"匿名参数1","匿名参数2","匿名参数3","匿名参数4"
});

console.log(output,err);
console.pause();
```

