免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5504 | 回复: 12

[文本处理] PowerShell - 如何创建自定义对象 [复制链接]

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
发表于 2017-07-15 11:28 |显示全部楼层
  1. <#
  2. function Valid($this){
  3.         if($this.Age -lt 18){
  4.             return $false
  5.         }
  6.         return $true
  7. }
  8. #>

  9. $person = [PSCustomObject]@{
  10.     Name = ""
  11.     Age = ""
  12. }



  13. $person.Name = "Elvis"
  14. $person.Age = 17
复制代码

能否在 $person 对象内部, 添加类似 Valid 函数的功能?

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
发表于 2017-07-16 15:08 |显示全部楼层
估计这项功能对于现在的 PowerShell 来说有点为难了,原以为 PowerShell 已经完全的面向对象,现在看来只是针对内置的一些经过封装的东西 被称为对象,
距离真正的对象编程语言 (编程领域的对象 多态, 封装, 继承) 还有一定的距离。

折衷方案
通过 Add-Type 导入其他语言预定义的类型, 以解决自身无法定义类型的短板。

哪位大神若知道更好的方法。请指教,谢谢。

论坛徽章:
0
发表于 2017-07-17 13:25 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
发表于 2017-07-17 14:49 |显示全部楼层
回复 3# 本友会机友会摄友会
[ValidateRange(1,10)][int]$n = 5


实在看不懂您举例的用意,能否给出一个示例代码。完成我在一楼提出的问题?

论坛徽章:
0
发表于 2017-07-17 17:02 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
发表于 2017-07-17 17:35 |显示全部楼层
回复 5# 本友会机友会摄友会
我想大神是没有明白我的意思, 伪代码:

cat elployees.txt
-----------------------
Elvis,19
Gray,23
Red,16


定义一个 Person 对象, 字段成员有2个。分别为 name, age、方法一枚 Valid。
Valid 方法用于判断 age 字段的数值是否大于等于 18 岁 否则返回 false。

示例:
  1. foreach($per in $people){
  2.     if($per.Valid()){
  3.         Write-Host $per.ToString()
  4.     }
  5. }
复制代码



论坛徽章:
0
发表于 2017-07-18 13:59 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
发表于 2017-07-18 18:29 |显示全部楼层
本帖最后由 sunzhiguolu 于 2017-07-18 18:37 编辑

回复 7# 本友会机友会摄友会
太棒了,多谢大神指点。
但是有个问题不明白,向大神请教:
  1. class Person{
  2.     [string] $name
  3.     [int] $age
  4.     Person([string] $name, [int] $age){
  5.         $this.name = $name
  6.         $this.age = $age
  7.     }

  8.     [bool] Valid(){
  9.         return $this.age -ge 18
  10.     }
  11. }


  12. $people = New-Object 'System.Collections.Generic.List[Person]'
  13. ("Elvis", "Red", "Gray", "David", "Friddle", "Frank", "Green", "Cat") | foreach{
  14.     $name = $_
  15.     $age = Get-Random -Maximum 21 -Minimum 16
  16.     [Person] $person = [Person]::new($name, $age)
  17.     $people.Add($person)
  18.     Write-Host ("Name = {0}, Age = {1}" -f $person.name, $person.age)
  19. }

  20. $people | Where-Object {$_.Valid()}
复制代码

输出结果如下:
Name = Elvis, Age = 18
Name = Red, Age = 20
Name = Gray, Age = 18
Name = David, Age = 16
Name = Friddle, Age = 16
Name = Frank, Age = 19
Name = Green, Age = 19
Name = Cat, Age = 16

name  age
----  ---
Elvis  18
Red    20
Gray   18
Frank  19
Green  19

能否在 Person 类的内部添加一个属性?类似如下的属性:
  1. class Person{
  2.     ....
  3.     [bool] IsChildren{
  4.         get{
  5.             return $this.age -lt 18
  6.         }
  7.     }
  8.     ....
  9. }
复制代码

可能有些时候,我并不想为方法传递参数。使用属性是最佳的方式,不知道能不能实现?



论坛徽章:
0
发表于 2017-07-19 15:00 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
发表于 2017-07-19 19:38 |显示全部楼层
回复 9# 本友会机友会摄友会


按照您那个弄了,但还是有问题呀 。
  1. class Person{
  2.     [string] $name
  3.     [int] $age

  4.     Person([string] $name, [int] $age){
  5.         $this.name = $name
  6.         $this.age = $age
  7.     }

  8.     [bool] Valid(){
  9.         return $this.age -ge 18
  10.     }

  11.     [bool] $IsChildren{
  12.         get { return $this.age -lt 18 }
  13.     }
  14. }
复制代码
所在位置 D:\PowerShell - Testing\Definition_Class.ps1:14 字符: 23
+     [bool] $IsChildren{
+                       ~
属性定义中缺少 ';' 或行尾。
所在位置 D:\PowerShell - Testing\Definition_Class.ps1:14 字符: 5
+     [bool] $IsChildren{
+     ~~~~~~~~~~~~~~~~~~
语句块或类型定义中缺少右“}”。
所在位置 D:\PowerShell - Testing\Definition_Class.ps1:17 字符: 1
+ }
+ ~
表达式或语句中包含意外的标记“}”。
    + CategoryInfo          : ParserError: (: ) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : MissingPropertyTerminator

类型 与 业务逻辑剥离 我感觉有以下几点好处,错误之处请老师指正。
  • 专心处理业务逻辑,不必关心处理细节
  • 相对的独立性 (与业务解耦)
  • 对象的多态,封装,继承 (是我最看重的一点)

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP