这是来自Ed Wilson编写的著作 PowerShell Best Practices上的一个例子。
如果没有现成的PowerShell命令可用,你可能会有自己写函数的想法。这可能是一个解决问题的好方式,但是你至少要考虑一下你的选择。
在下面的脚本中GetRandomObject.ps1,创建了一个函数,命令为GetRandomObject。该函数有两个输入参数。其中$in为数组对象, $count用来控制你要从输入的数组对象中选择的对象个数。
命令New-Object用来创建一个Microsoft .NET Framework类System.Random,使用默认构造函数(没有提供种子值)创建这个实例,然后保存到变量$rnd 中。
一个 for . . . next循环用来遍历这个集合——每次选择一个对象。接下来System.Random类的方法用来选择一个从1到输入的集合总数之间的随机数字。这个随机数字用来从输入对象中通过索引选择一个元素,脚本GetRandomObject.ps1如下:
Function GetRandomObject($in,$count) { $rnd = New-Object system.random for($i = 1 ; $i -le $count; $i ++) { $in[$rnd.Next(1,$a.length)] } #end for } #end GetRandomObject # *** entry point *** $a = 1,2,3,4,5,6,7,8,9 $count = 3 GetRandomObject -in $a -count $count
虽然上面的函数没有什么实质上的错误,但是你也可以在Windows PowerShell 2.0中使用Get-Random完成这个基本相同的目标。比如:
a = 1,2,3,4,5,6,7,8,9 Get-Random -InputObject $a -Count 3
很明显,使用命令 Get-Random 你可以省下自己的很多的时间和问题。可能使用GetRandomObject.ps1脚本的唯一原因是它可以在Windows PowerShell 2.0 和Windows PowerShell 1.0上面能同时工作。
使用cmdlet命令的一个优点是你信赖它会被正确的执行。有时候.NET Framework有一些较为复杂的构造函数,用来控制创建类的实例的方式。有一个误解就是,给这些构造函数传递一个值过去,不一定总会产生错误。这完全可能会造成脚本看似运行正确,也很难看到问题。
这一类错误的一个例子就是下面的脚本: BadGetRandomObject.ps1。为.NET Framework 类System.Random的构造函数传递一个整数过去。问题是每次脚本运行时,同样的随机数产生了。虽然这个具体的糟糕实现有点牵强,但它说明了一些潜在的逻辑错误通常需要详细的.NET Framework类的知识去解决。
BadGetRandomObject.ps1
Function GetRandomObject($in,$count,$seed) { $rnd = New-Object system.random($seed) for($i = 1 ; $i -le $count; $i ++) { $in[$rnd.Next(1,$a.length)] } #end for } #end GetRandomObject # *** entry point *** $a = 1,2,3,4,5,6,7,8,9 $count = 3 GetRandomObject -in $a -count $count -seed 5
原文作者:Ed Wilson, Microsoft Scripting Guy
引用链接:Avoiding PowerShell Scripting Pitfalls
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!