Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этом разделе описаны рекомендации, которые следует учитывать, чтобы обеспечить хорошую разработку и взаимодействие с пользователями. Иногда они могут применяться, и иногда они могут не применяться.
Рекомендации по проектированию
При разработке командлетов следует учитывать следующие рекомендации. Если вы найдете дизайнерское руководство, которое относится к вашей ситуации, обязательно ознакомьтесь с рекомендациями по программированию для подобных руководств.
Поддержка параметра InputObject (AD01)
Так как Windows PowerShell работает непосредственно с объектами Microsoft .NET Framework, объект .NET Framework часто доступен, который точно соответствует типу, который пользователю необходимо выполнить определенную операцию.
InputObject
— стандартное имя параметра, который принимает такой объект в качестве входных данных.
Например, пример Stop-Proc
командлета в руководстве StopProc определяет InputObject
параметр типа Process, поддерживающий входные данные из конвейера. Пользователь может получить набор объектов процесса, управлять ими, чтобы выбрать точные объекты для остановки, а затем передать их Stop-Proc
в командлет напрямую.
Поддержка параметра Force (AD02)
Иногда командлету необходимо защитить пользователя от выполнения запрошенной операции. Такой командлет должен поддерживать параметр Force , чтобы разрешить пользователю переопределить эту защиту, если у пользователя есть разрешения на выполнение операции.
Например, командлет Remove-Item обычно не удаляет файл только для чтения. Однако этот командлет поддерживает параметр Force , чтобы пользователь смог принудительно удалить файл только для чтения. Если пользователь уже имеет разрешение на изменение атрибута только для чтения, а пользователь удаляет файл, использование параметра Force упрощает операцию. Однако если у пользователя нет разрешения на удаление файла, параметр Force не действует.
Обработка учетных данных с помощью Windows PowerShell (AD03)
Командлет должен определить Credential
параметр для представления учетных данных. Этот параметр должен иметь тип System.Management.Automation.PSCredential и должен быть определен с помощью объявления атрибута Credential. Эта поддержка автоматически запрашивает у пользователя имя пользователя, пароль или в обоих случаях, когда полные учетные данные не предоставляются напрямую. Дополнительные сведения об атрибуте Credential см. в объявлении атрибута учетных данных.
Параметры кодирования поддержки (AD04)
Если командлет считывает или записывает текст в двоичную форму или из нее, например запись в файл или чтение из файла в файловой системе, командлет должен иметь параметр кодирования, указывающий, как текст закодирован в двоичной форме.
Тестовые командлеты должны возвращать логическое значение (AD05)
Командлеты, выполняющие тесты с их ресурсами, должны возвращать тип System.Boolean в конвейер, чтобы они могли использоваться в условных выражениях.
Рекомендации по коду
При написании кода командлета следует учитывать следующие рекомендации. Если вы найдете руководство, которое относится к вашей ситуации, обязательно ознакомьтесь с рекомендациями по проектированию для аналогичных рекомендаций.
Следуйте соглашениям об именовании классов командлетов (AC01)
Следуя стандартным соглашениям об именовании, вы делаете командлеты более обнаруживаемыми, и вы помогаете пользователю точно понять, что делают командлеты. Эта практика особенно важна для других разработчиков с помощью Windows PowerShell, так как командлеты являются общедоступными типами.
Определение командлета в правильном пространстве имен
Обычно класс для командлета определяется в пространстве имен .NET Framework, которое добавляется .Commands
в пространство имен, представляющее продукт, в котором выполняется командлет. Например, командлеты, включенные в Windows PowerShell, определяются в Microsoft.PowerShell.Commands
пространстве имен.
Присвойте классу командлета имя командлета
Присвойте классу .NET Framework, реализующим командлет, присвойте классу <Verb><Noun>Command
имя, в котором замените <Verb>
<Noun>
заполнители и заполнители глаголом и существительным, используемым для имени командлета. Например, командлет Get-Process реализуется классом с именем GetProcessCommand
.
Если входные данные конвейера не переопределяют метод BeginProcessing (AC02)
Если командлет не принимает входные данные из конвейера, обработка должна быть реализована в методе System.Management.Automation.Командлет.BeginProcessing . Использование этого метода позволяет Windows PowerShell поддерживать порядок между командлетами. Первый командлет в конвейере всегда возвращает свои объекты, прежде чем остальные командлеты в конвейере получают возможность начать обработку.
Чтобы обрабатывать запросы остановки, переопределите метод StopProcessing (AC03)
Переопределите метод System.Management.Automation.Командлет.StopProcessing , чтобы командлет может обрабатывать сигнал остановки. Некоторые командлеты занимают много времени, чтобы завершить свою операцию, и они позволяют длительное время передаваться между вызовами среды выполнения Windows PowerShell, например, когда командлет блокирует поток в длительных вызовах RPC. К ним относятся командлеты, которые выполняют вызовы к методу System.Management.Automation.Cmdlet.WriteObject , методу System.Management.Automation.Cmdlet.WriteError и другим механизмам обратной связи, которые могут занять много времени. В таких случаях пользователю может потребоваться отправить сигнал остановки этим командлетам.
Реализация интерфейса IDisposable (AC04)
Если командлет имеет объекты, которые не удаляются (записываются в конвейер) методом System.Management.Automation.Cmdlet.ProcessRecord , командлет может потребовать дополнительного удаления объектов. Например, если командлет открывает дескриптор файла в методе System.Management.Automation.Командлет.BeginProcessing и сохраняет дескриптор открытым для использования методом System.Management.Automation.Cmdlet.ProcessRecord , этот дескриптор должен быть закрыт в конце обработки.
Среда выполнения Windows PowerShell не всегда вызывает метод System.Management.Automation.Командлет.EndProcessing . Например, метод System.Management.Automation.Командлет.EndProcessing может не вызываться, если командлет отменяется в середине операции или если в любой части командлета возникает завершающая ошибка. Таким образом, класс .NET Framework для командлета, требующего очистки объектов, должен реализовать полный шаблон интерфейса System.IDisposable , включая метод завершения, чтобы среда выполнения Windows PowerShell может вызывать методы System.Management.Automation.Командлет.EndProcessing и System.IDisposable.Dispose* в конце обработки.
Использование типов параметров, понятных для сериализации (AC05)
Для поддержки выполнения командлета на удаленных компьютерах используйте типы, которые можно сериализовать на клиентском компьютере, а затем восстановить на серверном компьютере. Следующие типы доступны для сериализации.
Примитивные типы:
- Byte, SByte, Decimal, Single, Double, Int16, Int32, Int64, Uint16, UInt32 и UInt64.
- Boolean, Guid, Byte[], TimeSpan, DateTime, Uri и Version.
- Char, String, XmlDocument.
Встроенные типы rehydratable:
- 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.
См. также
необходимые рекомендации по разработке
PowerShell