Powershell cmdlet开发最佳实践

时间:2009-01-14 13:20:01

标签: powershell cmdlets

我目前正在整理一些Powershell cmdlet。建造它们很容易,但我不知道我是否以可接受的方式构建它们(可以这么说)。

在将数据传递到Powershell管道时,是否应遵循任何指导方针/最佳实践?目前,我实际上输出了一个DataSet类型的对象 - 如果任何cmdlet想要在下游使用它,那么它们必须遍历该DataSet中的DataTable,然后遍历每个DataTable中的DataRows。

我想这个问题是......我会通过这样做来打扰任何人吗?或者我应该输出本质上是一堆行的数据?

提前全部谢谢

-jt

2 个答案:

答案 0 :(得分:9)

输出任何类型的对象最好用于表示你要写的内容是可以接受的 - DataSet绝对没问题。唯一可能的警告是,PowerShell的v2可能会发现自己在.NET Framework的简化版本上运行(例如在Server Core上),因此如果这是您的cmdlet的潜在方案,则需要谨慎使用以确保您输出的对象存在于可能使用cmdlet的每个系统上。

总而言之,管道在包含对象集合时效果最好; DataSet本身不是一个集合。换句话说,您希望下游cmdlet能够通过管道一次接收一个对象,以便这些cmdlet不必手动枚举对象。我不知道你正在做什么 - 很可能是DataSet完全合适 - 但我通常更喜欢在内部看到一个cmdlet循环通过DataSet,创建自己的自定义对象(这样表中的每一列都成为属性),并将这些对象输出到管道。这只会增加下游cmdlet的数量,这些cmdlet可以消耗你正在推出的内容。

一个简单的测试是将cmdlet的输出传递给Export-CSV。如果它有效(并且它可能不适用于DataSet),那么你正在做正确的事情一般。现在,您可能需要创建一个输出DataSet的cmdlet,并且只有意图用于您编写的某些其他cmdlet(使用DataSet)以对该输出进行操作。没有错。但是,最大的灵活性是单个对象,因为它使所有PowerShell的核心cmdlet能够在您的输出上工作。

希望有所帮助。

答案 1 :(得分:7)

MSDN有一套惊人的Cmdlet Development Guidelines,我发现它在开发自己时非常有用。它们分为三个不同的部分: