有没有更好的方法在Powershell中获得'class'语义(定义自定义类型)?

时间:2010-08-11 19:24:18

标签: powershell class types

我正在使用Powershell构建一个自动化系统,我想定义自定义.Net类型,以便我可以用与我编写的其他代码类似的方式构建我的应用程序。

首先,我尝试使用' Add-Type '将c#文件中的类型导入我的应用程序,但我发现调试非常痛苦,因为.net类型只能加载一次在每个Powershell会议期间。这意味着当出现错误时,对我的代码进行一次更改需要我重新启动我的应用程序(我不妨使用C#)。

目前我正在使用工厂函数模拟Powershell中的类型,这些函数使用我需要的语义动态生成PSObjects。这确实有效,但它非常冗长,我似乎无法声明私有变量或封装方法。

有没有更简单的方法来实现我想要的目标?

如果不是......

我想通过使用抽象数据类型编写我的Powershell代码,以某种方式咆哮错误的树?

有没有更好的方法来构建我应该了解的系统?

我可以用我现在正在做的事情来实现一些封装吗?

1 个答案:

答案 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是私有成员,只能在函数GetVarAddToVar中使用。 checkRange也是私密的。


如果我需要真正的OOP(C#中提供),我个人不会将PowerShell用于此类任务。 PowerShell对对象有一些支持,但对OOP来说非常差。