避免PowerShell脚本陷阱


这是来自Ed Wilson编写的著作 PowerShell Best Practices上的一个例子。

如果没有现成的PowerShell命令可用,你可能会有自己写函数的想法。这可能是一个解决问题的好方式,但是你至少要考虑一下你的选择。

Windows PowerShell Best Practices

在下面的脚本中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

本文链接: https://www.pstips.net/avoiding-powershell-scripting-pitfalls.html
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!

关于 Mooser Lee

我是一个Powershell的爱好者,创建了PowerShell中文博客,热衷于Powershell技术的搜集和分享。本站部分内容来源于互联网,不足之处敬请谅解,并欢迎您批评指正。

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注