豆子之前在脚本里面自定义对象的时候一般是这么考虑的,我需要创建一个数组,每次循环的时候把一个自定义的对象放进去,对于这个自定义的对象的结构,我需要创建一个哈希表,然后转换成自定义对象。这个思路是没错,不过具体写的时候有些小技巧。
比如说最近看的一个小挑战,其中需要把下面这个$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
|
后来改进了一下,不需要在循环外定义,直接在循环里面就可以创建哈希表并强制转换了
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
|
再后来,发现还可以更精简一下
1
2
3
4
5
|
$gifts
=
$list
-split
"`n"
|
foreach
{
$split
=
$_
-split
" "
,2
[pscustomobject]
@{Count=
$split
[0];Item =
$split
[1].trim()}
}
$gifts
|
注意第一个方式是PS 2.0时代的写法,进入3.0以后就可以使用后面两张简单的写法了。
本文转自 beanxyz 51CTO博客,原文链接:http://blog.51cto.com/beanxyz/1737512,如需转载请自行联系原作者