有时候,非常有必要 所有管道数据处理前,写一个函数排序
你可能经常使用$Input来进行输入,但是有一些是在3.0后引进的输入新的自动变量,它将会让我们写出更好的代码.
首先我们看看使用powershell2.0提供的新功能,以及兼容的代码。
我们在输入的时候来收集和存储管道。脚本看起开可能常规模式是这样。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
function Test-Function
{ param
(
[ Parameter ( ValueFromPipeline = $true )]
$InputObject
)
begin
{
$container = @()
}
process
{
$container += $InputObject
}
end
{
$count = $container .Count
"Collected $count elements."
}
} |
当开始管理函数的数据的时候,他收集所有项目,然后开始处理,我们通常键入(当然有更好的方法,这里我就说明一下如何来用函数收集数据)
1
2
|
PS> 1..100 | Test-Function
Collected 100 elements. |
这是一个很多的代码,一个非常简单的任务,但是说明了他的代码很低效,它正在使用一个数组来收集收据,需要进行后续扩展,每一次我们都必须输入新的元素
当然,我们可以来完善它,例如,使用一个ArrayList对象作为集成。
但是在powershell3.0中,这样的事情变得非常轻松,自动输入变量,将为我们自动的数据采集和减少大家的代码量
1
2
3
4
5
6
7
8
9
10
|
function Test-Function
{ param
(
[ Parameter ( ValueFromPipeline = $true )]
$InputObject
)
$count = $Input .Count
"Collected $count elements."
} |
此功能和2.0上边的脚本执行结果是完全相同的,但是减少的代码,确实轻松不少执行效率也非常快,但是只能在powershell3.0中才可以使用。
在powershell2.0中输入的不是一个数组,只是一个枚举。枚举成员没有数量,你只能读一次。
因为它很容桂是这个功能与老的powershell版本兼容,我们要做的就打开输入到一个数组而已,这是powershell3.0默认的情况下,这是一个功能所有powershell版本都可以使用的。
1
2
3
4
5
6
7
8
9
10
11
|
function Test-Function
{ param
(
[ Parameter ( ValueFromPipeline = $true )]
$InputObject
)
$alldata = @( $Input )
$count = $alldata .Count
"Collected $count elements."
} |
注意:一定要把使用@()把输入$input 时圈起,如果不是上一个数组就应该使他变成一个新数组形式。
我们现在随时可以读取计数器内容。
记住的一点:
在使用$input 一定要加上管道参数@() 来解决数组的产生。