Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Одним из источников входных данных для командлета является объект в конвейере, который создается из вышестоящего командлета. В этом разделе описывается, как добавить параметр в командлет Get-Proc (описано в разделе создание первого командлета), чтобы командлет смог обработать объекты конвейера.
Этот командлет Get-Proc использует параметр Name
, принимающий входные данные из объекта конвейера, извлекает сведения о процессе с локального компьютера на основе указанных имен, а затем отображает сведения о процессах в командной строке.
Определение класса командлета
Первым шагом в создании командлета является всегда именование командлета и объявление класса .NET, реализующего командлет. Этот командлет извлекает сведения о процессе, поэтому выбранное здесь имя команды — Get. (Практически любой вид командлета, который может получить информацию, может обрабатывать входные данные командной строки.) Дополнительные сведения о утвержденных командах командлетов см. в имена командлетов.
Ниже приведено определение этого Get-Proc командлета. Сведения об этом определении приведены в создании первого командлета.
[Cmdlet(VerbsCommon.Get, "proc")]
public class GetProcCommand : Cmdlet
<Cmdlet(VerbsCommon.Get, "Proc")> _
Public Class GetProcCommand
Inherits Cmdlet
Определение входных данных из конвейера
В этом разделе описывается определение входных данных из конвейера для командлета. Этот командлет Get-Proc определяет свойство, представляющее параметр Name
, как описано в добавлении параметров, которые обрабатывают входныекомандной строки.
(Общие сведения об объявлении параметров см. в этом разделе.)
Однако если командлету необходимо обработать входные данные конвейера, он должен иметь свои параметры, привязанные к входным значениям среды выполнения Windows PowerShell. Для этого необходимо добавить ключевое слово ValueFromPipeline
или добавить ключевое слово ValueFromPipelineByProperty
в объявление атрибута System.Management.Automation.ParameterAttribute. Укажите ключевое слово ValueFromPipeline
, если командлет обращается к полному входной объекту. Укажите ValueFromPipelineByProperty
, если командлет обращается только к свойству объекта.
Ниже приведено объявление параметров для параметра Name
этого командлета Get-Proc, который принимает входные данные конвейера.
[Parameter(
Position = 0,
ValueFromPipeline = true,
ValueFromPipelineByPropertyName = true)]
[ValidateNotNullOrEmpty]
public string[] Name
{
get { return this.processNames; }
set { this.processNames = value; }
}
<Parameter(Position:=0, ValueFromPipeline:=True, _
ValueFromPipelineByPropertyName:=True), ValidateNotNullOrEmpty()> _
Public Property Name() As String()
Get
Return processNames
End Get
Set(ByVal value As String())
processNames = value
End Set
End Property
Предыдущее объявление задает ключевое слово ValueFromPipeline
true
, чтобы среда выполнения Windows PowerShell привязыла параметр к входящего объекта, если объект имеет тот же тип, что и параметр, или если он может быть принужен к тому же типу. Ключевое слово ValueFromPipelineByPropertyName
также имеет значение true
, чтобы среда выполнения Windows PowerShell проверяла входящие объекты для свойства Name
. Если входящий объект имеет такое свойство, среда выполнения привязывает параметр Name
к свойству Name
входящего объекта.
Примечание.
Параметр ключевого слова атрибута ValueFromPipeline
для параметра имеет приоритет над параметром для ключевого слова ValueFromPipelineByPropertyName
.
Переопределение метода обработки входных данных
Если командлет должен обрабатывать входные данные конвейера, необходимо переопределить соответствующие методы обработки входных данных. Основные методы обработки входных данных представлены в создании первого командлета.
Этот командлет Get-Proc переопределяет метод System.Management.Automation.Cmdlet.ProcessRecord для обработки входных данных параметра Name
, предоставленных пользователем или скриптом. Этот метод получает процессы для каждого запрошенного имени процесса или всех процессов, если имя не указано. Обратите внимание, что в System.Management.Automation.Cmdlet.ProcessRecordвызов WriteObject(System.Object,System.Boolean) — это механизм вывода для отправки выходных объектов в конвейер. Второй параметр этого вызова, enumerateCollection
, имеет значение true
, чтобы сообщить среде выполнения Windows PowerShell перечислить массив объектов процесса и записать один процесс в командную строку.
protected override void ProcessRecord()
{
// If no process names are passed to the cmdlet, get all processes.
if (processNames == null)
{
// Write the processes to the pipeline making them available
// to the next cmdlet. The second argument of this call tells
// PowerShell to enumerate the array, and send one process at a
// time to the pipeline.
WriteObject(Process.GetProcesses(), true);
}
else
{
// If process names are passed to the cmdlet, get and write
// the associated processes.
foreach (string name in processNames)
{
WriteObject(Process.GetProcessesByName(name), true);
} // End foreach (string name...).
}
}
Protected Overrides Sub ProcessRecord()
Dim processes As Process()
'/ If no process names are passed to the cmdlet, get all processes.
If processNames Is Nothing Then
processes = Process.GetProcesses()
Else
'/ If process names are specified, write the processes to the
'/ pipeline to display them or make them available to the next cmdlet.
For Each name As String In processNames
'/ The second parameter of this call tells PowerShell to enumerate the
'/ array, and send one process at a time to the pipeline.
WriteObject(Process.GetProcessesByName(name), True)
Next
End If
End Sub 'ProcessRecord
Пример кода
Полный пример кода C# см. в разделе GetProcessSample03 Sample.
Определение типов объектов и форматирования
Windows PowerShell передает сведения между командлетами с помощью объектов .NET. Следовательно, командлету может потребоваться определить собственный тип, или командлету может потребоваться расширить существующий тип, предоставленный другим командлетом. Дополнительные сведения об определении новых типов или расширении существующих типов см. в расширении типов объектов и форматировании.
Создание командлета
После реализации командлета его необходимо зарегистрировать в Windows PowerShell с помощью оснастки Windows PowerShell. Дополнительные сведения о регистрации командлетов см. в разделе Регистрация командлетов, поставщиков и ведущих приложений.
Тестирование командлета
После регистрации командлета в Windows PowerShell проверьте его, выполнив его в командной строке. Например, проверьте код для примера командлета. Дополнительные сведения об использовании командлетов из командной строки см. в Windows PowerShell.
В командной строке Windows PowerShell введите следующие команды, чтобы получить имена процессов через конвейер.
PS> type ProcessNames | Get-Proc
Отображаются следующие выходные данные.
Handles NPM(K) PM(K) WS(K) VS(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 809 21 40856 4448 147 9.50 2288 iexplore 737 21 26036 16348 144 22.03 3860 iexplore 39 2 1024 388 30 0.08 3396 notepad 3927 62 71836 26984 467 195.19 1848 OUTLOOK
Введите следующие строки, чтобы получить объекты процесса, имеющие свойство
Name
из процессов с именем IEXPLORE. В этом примере используется командлетGet-Process
(предоставляемый Windows PowerShell) в качестве команды вышестоящего потока для получения процессов IEXPLORE.PS> Get-Process iexplore | Get-Proc
Отображаются следующие выходные данные.
Handles NPM(K) PM(K) WS(K) VS(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 801 21 40720 6544 142 9.52 2288 iexplore 726 21 25872 16652 138 22.09 3860 iexplore 801 21 40720 6544 142 9.52 2288 iexplore 726 21 25872 16652 138 22.09 3860 iexplore
См. также
добавление параметров, которые обрабатывают входные командной строки
расширения типов объектов и форматирования
Регистрация командлетов, поставщиков и ведущих приложений
PowerShell