Powershell 自定义对象小技巧

简介:

豆子之前在脚本里面自定义对象的时候一般是这么考虑的,我需要创建一个数组,每次循环的时候把一个自定义的对象放进去,对于这个自定义的对象的结构,我需要创建一个哈希表,然后转换成自定义对象。这个思路是没错,不过具体写的时候有些小技巧。


比如说最近看的一个小挑战,其中需要把下面这个$list的值自定义一个对象保存出来。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$list  @"
1 Partridge in a pear tree
2 Turtle Doves
3 French Hens
4 Calling Birds
5 Golden Rings
6 Geese a laying
7 Swans a swimming
8 Maids a milking
9 Ladies dancing
10 Lords a leaping
11 Pipers piping
12 Drummers drumming
"@


我写的第一个版本是最啰嗦的:

1
2
3
4
5
6
7
8
9
10
11
$pp = $null
$pp = [ordered] @{ "Count" = $null ; "Gift" = $null }
$obj = New-Object  -TypeName psobject -property  $pp
$result =@()
$list .Split( "`n" |ForEach -Object{
$temp = $obj  | select *
$temp .Count= $_ .Split(" ")[0] 
$temp.Gift=$_.Substring($_.Split("" )[0].Length)
$result += $temp
}
$result

wKioL1ahWrXR61RLAAAaQ1CO79g963.png


后来改进了一下,不需要在循环外定义,直接在循环里面就可以创建哈希表并强制转换了

1
2
3
4
5
6
7
$result2 =@()
$list  -split  "`n"  foreach  {
$split  =   $_  -split  " " ,2
$temp = [pscustomobject] @{Count= $split [0];Item =  $split [1].trim()}
$result2 += $temp
}
$result2

wKiom1ahWn-y1lSbAAAaeA1kPXY289.png


再后来,发现还可以更精简一下

1
2
3
4
5
$gifts  $list  -split  "`n"  foreach  {
$split  =   $_  -split  " " ,2
[pscustomobject] @{Count= $split [0];Item =  $split [1].trim()}
}
$gifts

wKioL1ahWsaiJfSjAAAb4zb9nuc672.png


注意第一个方式是PS 2.0时代的写法,进入3.0以后就可以使用后面两张简单的写法了。










本文转自 beanxyz 51CTO博客,原文链接:http://blog.51cto.com/beanxyz/1737512,如需转载请自行联系原作者

目录
相关文章
|
存储 JSON 运维
PowerShell / 运维PowerShell 对象的序列化和反序列化
本文介绍Powershell中如何实现对象的序列化和反序列化。
124 0
|
3月前
【Azure Developer】使用PowerShell Where-Object方法过滤多维ArrayList时候,遇见的诡异问题 -- 当查找结果只有一个对象时,返回结果修改了对象结构,把多维变为一维
【Azure Developer】使用PowerShell Where-Object方法过滤多维ArrayList时候,遇见的诡异问题 -- 当查找结果只有一个对象时,返回结果修改了对象结构,把多维变为一维
|
6月前
|
存储 JSON 运维
PowerShell 对象的序列化和反序列化
PowerShell 对象的序列化和反序列化
120 0
下一篇
无影云桌面