咨询性的开发指南

本部分介绍应考虑确保良好的开发和用户体验的准则。 有时它们可能适用,有时可能不适用。

设计指南

设计 cmdlet 时,应考虑以下准则。 找到适用于你的情况的设计准则时,请务必查看类似准则的代码指南。

支持 InputObject 参数 (AD01)

由于 Windows PowerShell 直接与 Microsoft .NET Framework 对象一起使用,因此 .NET Framework 对象通常与用户执行特定作所需的类型完全匹配。 InputObject 是采用此类对象作为输入的参数的标准名称。 例如,StopProc 教程中的示例 Stop-Proc cmdlet 定义了一个InputObject支持管道输入的 Process 类型的参数。 用户可以获取一组进程对象,对其进行作以选择要停止的确切对象,然后将其直接传递给 Stop-Proc cmdlet。

支持 Force 参数 (AD02)

有时,cmdlet 需要保护用户执行请求的作。 如果用户有权执行该作,则此类 cmdlet 应支持 Force 参数,以允许用户替代该保护。

例如, Remove-Item cmdlet 通常不会删除只读文件。 但是,此 cmdlet 支持 Force 参数,以便用户可以强制删除只读文件。 如果用户已具有修改只读属性的权限,并且用户删除了该文件,则 Force 参数的使用简化了作。 但是,如果用户没有删除文件的权限, Force 参数将不起作用。

通过 Windows PowerShell 处理凭据 (AD03)

cmdlet 应定义一个 Credential 参数来表示凭据。 此参数的类型必须为 System.Management.Automation.PSCredential ,并且必须使用凭据属性声明定义。 当未直接提供完整凭据时,此支持会自动提示用户输入用户名、输入密码或同时提示两者。 有关凭据属性的详细信息,请参阅 凭据属性声明

支持编码参数 (AD04)

如果 cmdlet 读取或写入二进制格式的文本(例如对文件系统中的文件进行写入或读取),则 cmdlet 必须具有 Encoding 参数,该参数指定如何在二进制窗体中对文本进行编码。

测试 Cmdlet 应返回布尔值 (AD05)

对其资源执行测试的 Cmdlet 应将 System.Boolean 类型返回到管道,以便可以在条件表达式中使用它们。

代码准则

编写 cmdlet 代码时应考虑以下准则。 找到适用于你的情况的准则时,请务必查看类似指南的设计指南。

遵循 Cmdlet 类命名约定(AC01)

遵循标准命名约定,使 cmdlet 更易于发现,并帮助用户准确了解 cmdlet 执行的作。 这种做法对于使用 Windows PowerShell 的其他开发人员尤其重要,因为 cmdlet 是公共类型。

在正确的命名空间中定义 Cmdlet

通常,在 .NET Framework 命名空间中为 cmdlet 定义类,该类追加 .Commands 到表示运行 cmdlet 的产品的命名空间。 例如,Windows PowerShell 附带的 cmdlet 在命名空间中 Microsoft.PowerShell.Commands 定义。

将 Cmdlet 类命名为与 Cmdlet 名称匹配

为实现 cmdlet 的 .NET Framework 类命名时,请命名该类<Verb><Noun>Command,将<Verb><Noun>类替换为用于 cmdlet 名称的谓词和名词。 例如,Get-Process cmdlet 由名为 <a0/> 的类实现。

如果没有管道输入替代 BeginProcessing 方法 (AC02)

如果 cmdlet 不接受来自管道的输入,则应在 System.Management.Automation.Cmdlet.BeginProcessing 方法中实现处理。 使用此方法可让 Windows PowerShell 在 cmdlet 之间保持排序。 管道中的第一个 cmdlet 始终返回其对象,然后管道中剩余的 cmdlet 有机会开始处理。

处理停止请求会替代 StopProcessing 方法 (AC03)

重写 System.Management.Automation.Cmdlet.StopProcessing 方法,以便 cmdlet 可以处理停止信号。 某些 cmdlet 需要很长时间才能完成其作,并且允许在对 Windows PowerShell 运行时的调用之间进行长时间的传递,例如 cmdlet 在长时间运行的 RPC 调用中阻止线程时。 这包括调用 System.Management.Automation.Cmdlet.WriteObject 方法、 System.Management.Automation.Cmdlet.WriteError 方法以及其他可能需要很长时间才能完成的反馈机制的 cmdlet。 在这些情况下,用户可能需要向这些 cmdlet 发送停止信号。

实现 IDisposable 接口 (AC04)

如果 cmdlet 具有未由 System.Management.Automation.Cmdlet.ProcessRecord 方法释放(写入管道)的对象,则 cmdlet 可能需要其他对象处置。 例如,如果 cmdlet 在其 System.Management.Automation.Cmdlet.BeginProcessing 方法中打开文件句柄,并使句柄保持打开状态以供 System.Management.Automation.Cmdlet.ProcessRecord 方法使用,则必须在处理结束时关闭此句柄。

Windows PowerShell 运行时并不总是调用 System.Management.Automation.Cmdlet.EndProcessing 方法。 例如,如果 cmdlet 在作中途取消或 cmdlet 的任何部分发生终止错误,则可能不会调用 System.Management.Automation.Cmdlet.EndProcessing 方法。 因此,需要对象清理的 cmdlet 的 .NET Framework 类应实现完整的 System.IDisposable 接口模式,包括终结器,以便 Windows PowerShell 运行时可以在处理结束时调用 System.Management.Automation.Cmdlet.EndProcessingSystem.IDisposable.Dispose* 方法。

使用序列化友好的参数类型(AC05)

若要支持在远程计算机上运行 cmdlet,请使用可在客户端计算机上序列化的类型,然后在服务器计算机上解除冻结。 以下类型是序列化友好的。

基元类型:

  • 字节、SByte、Decimal、Single、Double、Int16、Int32、Int64、Uint16、UInt32 和 UInt64。
  • 布尔值、Guid、Byte[]、TimeSpan、DateTime、Uri 和版本。
  • Char、String、XmlDocument。

内置可解冻类型:

  • PSPrimitiveDictionary
  • 开关参数
  • PSListModifier
  • PSCredential
  • IPAddress、MailAddress
  • CultureInfo
  • X509Certificate2、X500DistinguishedName
  • DirectorySecurity、FileSecurity、RegistrySecurity

其他类型的:

  • SecureString
  • 容器(上述类型的列表和字典)

对敏感数据使用 SecureString (AC06)

处理敏感数据时,始终使用 System.Security.SecureString 数据类型。 这可能包括参数的管道输入,以及向管道返回敏感数据。

虽然 .NET 建议不使用 SecureString 进行新开发,但 PowerShell 继续支持 SecureString 类以实现向后兼容性。 使用 SecureString 仍然比使用纯文本字符串更安全。 PowerShell 仍依赖于 SecureString 类型,以避免意外将内容公开到控制台或日志中。 请仔细使用 SecureString ,因为它可以轻松转换为纯文本字符串。 有关使用 SecureString 的完整讨论,请参阅 System.Security.SecureString 类文档。

另请参阅

所需的开发准则

强烈鼓励的发展准则

编写 Windows PowerShell Cmdlet