忘记密码   免费注册 查看新帖 | 论坛精华区

ChinaUnix.net

  平台 论坛 博客 认证专区 大话IT HPC论坛 徽章 文库 沙龙 自测 下载 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
12下一页
最近访问板块 发新帖
查看: 2506 | 回复: 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 |显示全部楼层
1 你1楼已经创建自定义对象了。

2 。net对象,ps对象,的值,是有约束的。但你想过没有,啥时候才会用到这些约束?
答写入时。
所以说,你在函数编写时,肯定是有设定地方的。
看看函数编写的官方手册去把。
https://msdn.microsoft.com/en-us ... advanced_parameters

3 先告诉你1个:
[ValidateRange(1,10)][int]$n = 5

4 我不太懂perl,菜鸟一个,但我的想法如下:
原以为perl 6已经完全的面向对象,现在看来只是针对内置的一些经过封装的东西 被称为对象,
距离真正的对象编程语言 (编程领域的对象 多态, 封装, 继承) 还有一定的距离。
而且这么多年了也没发布出
我还想学perl哩,能面向对象吗?能面向对象的,版本6,啥时候能出啊?

论坛徽章:
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 |显示全部楼层
  1. function abc([ValidateRange(1,10)][int]$n)
  2. {
  3.         $person = [PSCustomObject]@{
  4.                 Name = "a"
  5.                 Age  = $n
  6.         }
  7.         Write-Host $person
  8. }

  9. abc 9 #开始调用函数

  10. abc 11

  11. abc 8
复制代码

论坛徽章:
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 |显示全部楼层
本帖最后由 本友会机友会摄友会 于 2017-07-18 14:03 编辑

奥,让我想起了,我最开始学ps的那段时间。
我用  $Person = new-object psobject 来创建对象。
用add-member -name aaa -value bbb -membertype xxx -inputobject $Person来给对象增加属性。
用update什么绑定方法。这个不常用,忘了。
后来这种方法我就不用了,因为主要用属性。用$person = [PSCustomObject]@{}更方便些。
但是呢,用这种方法,创建对象也麻烦不到哪去。
-----------------------------------------
现在还有一种方法,就是编写类。这是ps5新增的。
写好类后,类中有属性,有方法。严格的面向对象。
使用的时候,new你的自定义类即可。
参考 class。https://msdn.microsoft.com/en-us ... about/about_classes
------------------------------------
我想给你说两点:
1 就是要深究对象这个概念。powershell本质是。net,powershell是面向对象的,绝对无需质疑。因为。net出的太晚,面向对象理论已经成熟。
甚至可以说python2不是纯种面向对象的(python2 为什么没有str.length,只有len(str),而py3有str.length),而powershell是。

2即便ps是纯种的面向对象语言,py函数混杂对象的语言。
对我们脚本人并没有叼用。
有必要深究对象,方法,属性这个概念,没必要按照面向对象规矩编写脚本。
我们脚本人,常用的是命令 + 参数。编写的是函数。
从这个角度来说,更偏函数些。
所以,没有必要非要用正宗的面向对象的方法,来写代码。如new-object psobject,add-member。class。
除非你的项目很大,要求很高,要求很模块化。
否则,用5楼的做法,编写函数足矣。甚至有时候,我们连函数都省了,对吧。


论坛徽章:
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 |显示全部楼层
本帖最后由 本友会机友会摄友会 于 2017-07-19 15:12 编辑

可以呀,任何属性内,不都是有get,set方法吗?
[bool] $IsChildren{
get{return $this.age -lt 18}
set {#这里应该有个$value之类的东西,具体你自己研究一下}
}


new-object 类名,实例化一个类,和给函数传值,道理是一个样的。我想问问,你为何对new类情有独钟?

论坛徽章:
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号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP