• 运维:Powershell面向对象编程简介


    运维/powershell
    Powershell面向对象编程简介

    作者李俊才 (jcLee95)https://blog.csdn.net/qq_28550263
    邮箱 :291148484@163.com
    本文地址https://blog.csdn.net/qq_28550263/article/details/132872318



    1. 概述

    PowerShell 的设计理念之一是一切都是对象。即使是基本数据类型,也有对应的对象表示。在PowerShell中,对象是一种核心概念,它们用于表示数据和操作数据。PowerShell是一种脚本语言和Shell环境,允许你处理各种对象,包括.NET Framework中的对象、自定义对象和内置的对象。下面我们将讨论PowerShell中的对象以及与面向对象编程相关的内容。

    2. PowerShell中的对象

    PowerShell中的对象是.NET Framework中的.NET对象,它们包括各种类型,例如字符串、整数、数组、哈希表、自定义对象等。

    • 基本数据类型: 在PowerShell中,你可以处理像整数、字符串、浮点数等基本数据类型。在 PowerShell 中,基本数据类型(例如整数、字符串、浮点数等)都可以被视为对象。例如,你可以将两个整数相加并将结果存储在一个变量中。

      $a = 5
      $b = 10
      $sum = $a + $b
      
      • 1
      • 2
      • 3
    • 数组: 数组是包含多个元素的有序集合,你可以使用索引访问这些元素。

      $fruits = @("Apple", "Banana", "Cherry")
      $fruits[1] # 输出 "Banana"
      
      • 1
      • 2
    • 哈希表: 哈希表是一种键值对集合,允许你将值与唯一的键相关联。在PowerShell中,你可以使用哈希表来存储和检索数据。

      $person = @{
          "Name" = "John"
          "Age" = 30
          "City" = "New York"
      }
      $person["Name"] # 输出 "John"
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
    • 自定义对象: 你可以创建自己的自定义对象,这些对象可以包含自定义属性和方法。自定义对象是PowerShell中面向对象编程的一部分。

      $person = New-Object PSObject -Property @{
          "Name" = "Alice"
          "Age" = 25
      }
      $person | Add-Member -MemberType NoteProperty -Name "City" -Value "Los Angeles"
      $person.Name # 输出 "Alice"
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6

    3. 面向对象编程

    虽然PowerShell主要是一种脚本语言,但也支持面向对象编程(OOP)的概念。在PowerShell中,你可以创建和操作自定义对象,将方法绑定到对象,以及继承和封装等OOP概念。

    以下是与面向对象编程相关的PowerShell概念:

    类和对象

    你可以使用类来定义对象的蓝图,然后使用该类来创建对象实例。这使你可以将属性和方法捆绑到对象。例如:

    class Employer {
        [string]$Name
        [int]$Age
    
        Employer([string]$name, [int]$age) {
            $this.Name = $name
            $this.Age = $age
        }
    
        [void] SayHello() {
            Write-Host "Hello, my name is $($this.Name) and I am $($this.Age) years old."
        }
    }
    
    $employer = [Employer]::new("Jack", 28)
    $employer.SayHello() # 输出 "Hello, my name is Jack and I am 28 years old."
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    输出结果为:

    Hello, my name is Jack and I am 28 years old.
    
    • 1

    枚举

    枚举(Enum)是一种特殊的数据类型,它用于定义一组命名的常量值。枚举在某种程度上也可以被看作是一种特殊的类,尽管它们在语法上和用途上与常规类有一些不同。PowerShell同样支持枚举类型。枚举类似于类,其中包含成员。这些成员在枚举中被看作是常量字段。你可以为枚举成员指定特定的值,就像你可以为类的字段指定值一样。这些值是不可变的,不会被修改。在PowerShell中,你可以创建和使用枚举来提高代码的可读性和可维护性。

    1. 定义枚举

    在PowerShell中,你可以使用enum关键字来定义枚举。以下是一个示例:

    enum DaysOfWeek {
        Monday
        Tuesday
        Wednesday
        Thursday
        Friday
        Saturday
        Sunday
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    这里我们定义了一个名为DaysOfWeek的枚举,其中包含了一周中的每一天。

    2. 使用枚举

    一旦你定义了枚举,你可以在代码中使用它。枚举成员可以通过点符号访问。例如:

    $today = [DaysOfWeek]::Monday
    Write-Host $today    
    
    • 1
    • 2

    上面的代码将$today设置为枚举DaysOfWeek的一个成员,即"Monday"。输出结果为:

    Monday
    
    • 1

    3. 枚举的值

    默认情况下,枚举的成员的值是从0开始的整数。你也可以为枚举成员显式指定值,如下所示:

    enum DaysOfWeek {
        Monday = 1
        Tuesday = 2
        Wednesday = 3
        Thursday = 4
        Friday = 5
        Saturday = 6
        Sunday = 7
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在上面的示例中,我们为每个枚举成员指定了一个整数值,这使得枚举的值更有意义。

    4. 使用枚举改进代码可读性

    枚举在代码中提供了更好的可读性,尤其是在你需要表示一组相关的常量值时。它们可以用于改进代码的可维护性,因为它们允许你使用有意义的命名来代替硬编码的值。

    例如,假设你有一个函数,根据一周的某一天执行不同的操作:

    # 定义一个枚举类型 DaysOfWeek,表示一周中的每一天
    enum DaysOfWeek {
        Monday
        Tuesday
        Wednesday
        Thursday
        Friday
        Saturday
        Sunday
    }
    
    # 定义一个函数 DoWork,接受一个 DaysOfWeek 类型的参数 $day
    function DoWork([DaysOfWeek]$day) {
        # 使用 switch 语句根据不同的 $day 值执行不同的操作
        switch ($day) {
            Monday {
                Write-Host "今天是星期一,是一周的开始。"
            }
            Friday {
                Write-Host "今天是星期五,是时候庆祝了!"
            }
            default {
                Write-Host "今天是一周中的其他一天。"
            }
        }
    }
    
    # 调用 DoWork 函数并传递一个 DaysOfWeek 值作为参数
    DoWork Monday
    DoWork Friday
    DoWork Wednesday
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    本例中,我们使用枚举DaysOfWeek作为函数参数,以提高代码的可读性和清晰度。这段代码的运行结果为:

    今天是星期一,是一周的开始。
    今天是星期五,是时候庆祝了!
    今天是一周中的其他一天。
    
    • 1
    • 2
    • 3

    继承

    你可以创建类的继承关系,一个类可以继承另一个类的属性和方法。

    class Employee {
        [string]$Name
        [int]$Age
    
        Employee([string]$name, [int]$age) {
            $this.Name = $name
            $this.Age = $age
        }
    
        [string] SayHello() {
            return "Hello, my name is $($this.Name) and I am $($this.Age) years old."
        }
    }
    
    class Employer: Employee {
        [string]$EmployeeID
    
        Employer([string]$name, [int]$age, [string]$employeeID) : base($name, $age) {
            $this.EmployeeID = $employeeID
        }
        
        [string] SayHello() {
            return "Hello, my name is $($this.Name) and I am $($this.Age) years old and I'm glad to be your boss."
        }
    }
    
    # 创建 Employee 对象
    $employee = [Employer]::new("Jack", 28, "ID00001")
    
    # 调用 SayHello 方法
    $greeting = $employee.SayHello()
    Write-Host $greeting
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    这个例子中,老板继承于员工,并作为特殊的员工重写了员工类的SayHello方法。其运行后的输出结果为:

    Hello, my name is Jack and I am 28 years old and I'm glad to be your boss.
    
    • 1

    封装

    你可以使用访问修饰符来控制属性和方法的访问级别,实现封装。例如:

    class BankAccount {
        [string]$AccountNumber
        [decimal]$Balance
    
        <#
        构造函数:BankAccount
        初始化银行账户对象。
    
        参数:
        $accountNumber (string) - 账户号码
        $balance (decimal) - 初始余额
    
        返回值:
        无
        #>
        BankAccount([string]$accountNumber, [decimal]$balance) {
            $this.AccountNumber = $accountNumber
            $this.Balance = $balance
            Write-Host "账户创建成功,账号:$($this.AccountNumber),余额:$($this.Balance)。"
        }
    
        <#
        存款方法:Deposit
        存入指定金额到银行账户。
    
        参数:
        $amount (decimal) - 存款金额
    
        返回值:
        无
        #>
        [void] Deposit([decimal]$amount) {
            $this.Balance += $amount
            Write-Host "存款成功,存入金额:$($amount),账号:$($this.AccountNumber)。新余额:$($this.Balance)。"
        }
    
        <#
        取款方法:Withdraw
        从银行账户中取出指定金额。
    
        参数:
        $amount (decimal) - 取款金额
    
        返回值:
        无
        #>
        [void] Withdraw([decimal]$amount) {
            if ($this.Balance -ge $amount) {
                $this.Balance -= $amount
                Write-Host "取款成功,取出金额:$($amount),账号:$($this.AccountNumber)。新余额:$($this.Balance)。"
            } else {
                Write-Host "余额不足。"
            }
        }
    }
    
    $account = [BankAccount]::new("A12345", 1000)
    $account.Deposit(500)
    $account.Withdraw(200)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60

    这段代码是一个示例的 PowerShell 类 BankAccount,它代表了一个简单的银行账户,通过面向对象编程中的封装性,它封装了账户的状态和操作。

    • 属性的封装性: 在类定义中,有两个属性 AccountNumberBalance,它们被声明为 [string][decimal] 类型,分别用于存储账户号码和余额信息。这些属性被封装在类内部,外部无法直接访问或修改它们的值。这种封装性确保了账户数据的安全性和完整性。
    • 构造函数的封装性: 构造函数 BankAccount 用于初始化账户对象,接受两个参数 accountNumberbalance,分别用于设置账户号码和初始余额。这些参数在构造函数内部被分配给类的属性 AccountNumberBalance,而外部代码无法直接访问或更改它们。
    • 方法的封装性: 类中定义了两个方法 DepositWithdraw,它们用于执行存款和取款操作。这些方法也封装了账户的行为,外部代码只能通过方法调用来与账户对象交互,而不能直接操作账户的属性。
    • 数据隐藏: 在方法内部,你可以看到它们对属性的操作是通过 $this 关键字来访问的,如 $this.AccountNumber$this.Balance。这种方式隐藏了属性的具体实现细节,外部代码只需要知道如何通过方法来进行操作,而不需要关心内部属性的结构。

    另外,这段代码的输出结果为:

    账户创建成功,账号:A12345,余额:1000。
    存款成功,存入金额:500,账号:A12345。新余额:1500。
    取款成功,取出金额:200,账号:A12345。新余额:1300。
    
    • 1
    • 2
    • 3

    通过上面这些例子,我们可以看到,PowerShell虽然是一种脚本语言,但它提供了许多面向对象编程的能力,包括创建和操作自定义对象、继承、封装和多态。这使得PowerShell不仅适用于自动化任务,还适用于复杂的应用程序开发和管理任务。

  • 相关阅读:
    分布式系统关注点:“熔断”以及最佳实践方法
    深入探求:中国精益生产与管理实践的崭新视角
    Java刷题day32
    基于ssm+vue设备配件检修管理系统
    自然语言处理部分内容---NLP
    mysql兼容微信表情
    【LeetCode】383. 赎金信
    海藻酸钠-聚乙二醇-四嗪 TZ-PEG-alginate 四嗪修饰海藻酸钠 海藻酸钠-PEG-四嗪
    leetcode 1208.尽可能使字符串相等 滑动窗口
    Python接口自动化测试:利用的是requests库,Fiddler抓包配合、以及鉴权的流程
  • 原文地址:https://blog.csdn.net/qq_28550263/article/details/132872318