lea*_*fix 2 oop powershell design-patterns structure
我不确定如何构建使用类的更大的 PowerShell 脚本,而且我找不到任何内容。我在一个文件中有五个类。如果没有主类,我该如何调用它们?创建一个简单地实例化其他类并调用它们的独立脚本是否正确?
在 PowerShell 中,我看到的大多数内容都是基于函数,而不是类。而且,PowerShell OOP 和 OOD 与C# 或 Java 意义上的 OOP 设计并不完全一样。有很多相同的概念,但结构让我困惑。如果我不能以全面的方式使用关键字和类进行设计,那么仅有关键字和类是不够的。
我缺少什么搜索,它们是关键字吗?我应该如何构建我的脚本?我已经有很多 PowerShell 类,我想将它们投入生产。怎么办?
我搜索过,也看过 SO 和 Github,但不知道什么是“正确的”。
我的具体情况是使用 v5,但其他时候我可以访问 v7,如果这很重要的话。我有,例如:
class A
{
}
class B
{
}
class C
{
}
Run Code Online (Sandbox Code Playgroud)
PowerShell 中无法Main启动任何事情。
PowerShell 中无法
Main启动任何事情。
脚本(文件)的顶级范围相当于.ps1入口Main 点。也就是说,执行类和函数定义之外的任何语句。
您可以自由地将定义放置在脚本中的任何位置,因为它们在执行之前class进行解析(这与函数相反,函数的定义必须放置在调用它们的代码之前)。
或者,您可以放置class es:
在一个单独的.ps1文件中,您必须在主脚本中点源该文件,然后才能尝试使用它们。
例如,点源classes.ps1位于与脚本相同的文件夹中:
. $PSScriptRoot/classes.ps1
Run Code Online (Sandbox Code Playgroud)
在支持模块中,您的主脚本必须通过using module脚本开头的语句导入该模块(不起作用Import-Module,因为它不导入类)
例如,在最简单的情况下,如果您的类位于与classes.psm1脚本相同的文件夹中的独立脚本模块文件中:
# Place at the top; no other statements (except other `using` ones)
# allowed before it.
using module ./classes.psm1
Run Code Online (Sandbox Code Playgroud)
笔记:
除非您需要从多个脚本使用您的类(可能通过模块自动加载),否则使用模块没有任何好处。
一般警告:
classes 是 PowerShell 语言的一个相对较晚的补充,就功能而言,与 C# 的类不相提并论 - 目前两者都不是(有关当前问题的列表,请参阅GitHub 问题 #6652),也不是设计目标。
虽然 PowerShell 完全能够对对象(类实例)进行操作,最常见的是通过访问其属性,很少通过调用其方法,但 PowerShell 语言本身并不是以对象为中心的,而是使用基于命令(脚本、函数)的命令式控制流,外部程序)。
因此,不要尝试将 PowerShell 代码构造为 C# 应用程序,建议将classes 的使用限制为提供偶尔的帮助程序类,例如强类型的“属性包”,同时通过以下方式实现控制流脚本、函数和 cmdlet。