我正在使用Powershell构建一个自动化系统,我想定义自定义.Net类型,以便我可以用与我编写的其他代码类似的方式构建我的应用程序。
首先,我尝试使用' Add-Type '将c#文件中的类型导入我的应用程序,但我发现调试非常痛苦,因为.net类型只能加载一次在每个Powershell会议期间。这意味着当出现错误时,对我的代码进行一次更改需要我重新启动我的应用程序(我不妨使用C#)。
目前我正在使用工厂函数模拟Powershell中的类型,这些函数使用我需要的语义动态生成PSObjects。这确实有效,但它非常冗长,我似乎无法声明私有变量或封装方法。
有没有更简单的方法来实现我想要的目标?
如果不是......
我想通过使用抽象数据类型编写我的Powershell代码,以某种方式咆哮错误的树?
有没有更好的方法来构建我应该了解的系统?
我可以用我现在正在做的事情来实现一些封装吗?
答案 0 :(得分:2)
1)我还没有尝试过,但这个项目看起来很有希望:PSClass - Object Oriented Scripting in Powershell。它提供的一些功能:
PsClass目前正在实施 Powershell在一个文件中。做到了 简单易用。它支持 遵循OO概念。
- 继承
- 多态性
- 封装
- 带参数的构造函数
- 注释 - 读写变量
- 方法 - scriptblocks
- 带有获取脚本块和可选的Set scriptblocks的属性
- 静态和私人笔记和方法
2)您可以使用以下自定义模块:
$o = New-Module -AsCustomObject -Function GetVar, AddToVar {
$script:var = 1
function checkRange { if ($var -gt 3 -or $var -lt 0) { throw 'not in range <0,3>' } }
function GetVar { $script:var }
function AddToVar { param($add) checkRange; $script:var += $add; $script:var }
}
$o.GetVar()
$o.AddToVar(2)
$o.AddToVar(1)
$o.GetVar()
$o.checkRange()
$o | gm
尝试将其复制到ide /控制台并运行它。 $script:var
是私有成员,只能在函数GetVar
,AddToVar
中使用。 checkRange
也是私密的。
如果我需要真正的OOP(C#中提供),我个人不会将PowerShell用于此类任务。 PowerShell对对象有一些支持,但对OOP来说非常差。