Powershell cmdlets开发最佳实践

11

我目前正在编写一些 Powershell 命令。构建它们相当容易,但我不知道我是否以可接受的方式构建了它们(这么说)。

是否有任何指南/最佳实践,应该遵循将数据传递到 Powershell 管道中?目前,我实际上输出了一个类型为 DataSet 的单个对象 - 如果任何 cmdlet 想要在下游使用它,那么他们将不得不遍历该 DataSet 中的 DataTable,在每个 DataTable 中循环遍历 DataRows。

我想问题是...我这样做会惹怒任何人吗?还是我应该输出本质上是一堆行的数据?

提前感谢所有人

-JT

2个回答

9
输出任何最适合表示所输出内容的对象类型都是可以接受的——DataSet绝对没问题。唯一需要注意的是,PowerShell v2 可能会在.NET Framework(如Server Core)的缩减版本上运行,因此,如果你的 cmdlet 可能在任何系统上使用,则需要小心确保所输出的对象在每个系统上都存在。
话虽如此,当管道包含对象集合时,它的工作效果最佳;DataSet 本身并不是一个集合。换句话说,你希望下游 cmdlet 能够通过管道逐个接收对象,这样这些 cmdlet 就不必手动枚举对象了。我不太清楚你具体在做什么——DataSet 可能完全合适——但我通常更喜欢看到一个 cmdlet 在内部循环遍历 DataSet,创建自己的自定义对象(使表中的每一列成为属性),并将这些对象输出到管道中。这只是增加了能够消费你所输出内容的下游 cmdlet 的数量。
一个简单的测试是将你的 cmdlet 输出管道到 Export-CSV。如果它能正常工作(而 DataSet 可能不能),那么你 通常 是在做正确的事情。现在,你可能需要创建一个 cmdlet 来输出 DataSet,并且你只打算让你编写的某些其他 cmdlet(消耗 DataSet)对该输出进行操作。这没有问题。然而,最大的灵活性在于单个对象,因为它使得 PowerShell 的所有核心 cmdlet 都能够处理你的输出。
希望这有所帮助。

7

链接现在都已经失效了。 - Eduardo Wada
新链接:https://learn.microsoft.com/zh-cn/powershell/scripting/developer/cmdlet/cmdlet-development-guidelines?view=powershell-7.2 - Kirill Kovalenko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接