Select-Object

Выбирает объекты или свойства объектов.

Синтаксис

Select-Object
      [-InputObject <PSObject>]
      [[-Property] <Object[]>]
      [-ExcludeProperty <String[]>]
      [-ExpandProperty <String>]
      [-Unique]
      [-Last <Int32>]
      [-First <Int32>]
      [-Skip <Int32>]
      [-Wait]
      [<CommonParameters>]
Select-Object
      [-InputObject <PSObject>]
      [[-Property] <Object[]>]
      [-ExcludeProperty <String[]>]
      [-ExpandProperty <String>]
      [-Unique]
      [-SkipLast <Int32>]
      [<CommonParameters>]
Select-Object
      [-InputObject <PSObject>]
      [-Unique]
      [-Wait]
      [-Index <Int32[]>]
      [<CommonParameters>]
Select-Object
      [-InputObject <PSObject>]
      [-Unique]
      [-SkipIndex <Int32[]>]
      [<CommonParameters>]

Описание

Командлет Select-Object выбирает указанные свойства объекта или набора объектов. Он также может выбирать уникальные объекты, указанное число объектов или объекты в указанной позиции в массиве.

Чтобы выбрать объекты из коллекции, используйте параметры First, Last, Unique, Skip и Index. Чтобы выбрать свойства объектов, используйте параметр Property. При выборе свойств возвращает новые объекты, Select-Object имеющие только указанные свойства.

Начиная с Windows PowerShell 3.0, включает функцию оптимизации, Select-Object которая не позволяет командам создавать и обрабатывать объекты, которые не используются.

При включении Select-Object команды с параметрами First или Index в командном конвейере PowerShell останавливает команду, которая создает объекты сразу после создания выбранного числа объектов, даже если команда, которая создает объекты перед Select-Object командой в конвейере. Чтобы отключить эту функцию оптимизации, используйте параметр Wait.

Примеры

Пример 1. Выбор объектов по свойству

В этом примере создаются объекты с свойствами Name, ID и рабочего набора (WS) объектов процесса.

Get-Process | Select-Object -Property ProcessName, Id, WS

Пример 2. Выбор объектов по свойству и форматирование результатов

Этот пример получает сведения о модулях, используемых процессами на компьютере. Он использует Get-Process командлет для получения процесса на компьютере.

Он использует Select-Object командлет для вывода массива [System.Diagnostics.ProcessModule] экземпляров, содержащихся в свойстве Modules каждого System.Diagnostics.Process выходного экземпляра Get-Process.

Параметр Property командлета Select-Object выбирает имена процессов. Это добавляет NoteProperty к каждому [System.Diagnostics.ProcessModule]ProcessName экземпляру и заполняет его значением свойства ProcessName текущего процесса.

Наконец, Format-List командлет используется для отображения имени и модулей каждого процесса в списке.

Get-Process Explorer | Select-Object -Property ProcessName -ExpandProperty Modules | Format-List

ProcessName       : explorer
ModuleName        : explorer.exe
FileName          : C:\WINDOWS\explorer.exe
BaseAddress       : 140697278152704
ModuleMemorySize  : 3919872
EntryPointAddress : 140697278841168
FileVersionInfo   : File:             C:\WINDOWS\explorer.exe
                    InternalName:     explorer
                    OriginalFilename: EXPLORER.EXE.MUI
                    FileVersion:      10.0.17134.1 (WinBuild.160101.0800)
                    FileDescription:  Windows Explorer
                    Product:          Microsoft Windows Operating System
                    ProductVersion:   10.0.17134.1
...

Пример 3. Выбор процессов с использованием большей части памяти

В этом примере получается пять процессов, использующих большую часть памяти. Командлет Get-Process получает процессы на компьютере. Командлет Sort-Object сортирует процессы в соответствии с использованием памяти (рабочего набора), а Select-Object командлет выбирает только последние пять членов результирующего массива объектов.

Параметр Wait не требуется в командах, включающих Sort-Object командлет, так как Sort-Object обрабатывает все объекты, а затем возвращает коллекцию. Оптимизация Select-Object доступна только для команд, возвращающих объекты по отдельности по мере их обработки.

Get-Process | Sort-Object -Property WS | Select-Object -Last 5

Handles  NPM(K)    PM(K)      WS(K) VS(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
2866     320       33432      45764   203   222.41   1292 svchost
577      17        23676      50516   265    50.58   4388 WINWORD
826      11        75448      76712   188    19.77   3780 Ps
1367     14        73152      88736   216    61.69    676 Ps
1612     44        66080      92780   380   900.59   6132 INFOPATH

Пример 4. Выбор уникальных символов из массива

В этом примере используется уникальный параметр Select-Object для получения уникальных символов из массива символов.

"a","b","c","a","a","a" | Select-Object -Unique

a
b
c

Пример 5. Использование параметра -Unique с другими параметрами

Значения уникальных параметров фильтруют после применения других Select-Object параметров. Например, если для выбора первого числа элементов в массиве используется первый параметр First , значение Unique применяется только к выбранным значениям, а не ко всему массиву.

"a","a","b","c" | Select-Object -First 2 -Unique

a

В этом примере сначала выбирается "a","a" в качестве первых 2 элементов в массиве. Уникальный применяется и "a","a" возвращается a в качестве уникального значения.

Пример 6. Выбор новых и старейших событий в журнале событий

В этом примере возвращаются первые (новейшие) и последние (самые старые) события в журнале событий Windows PowerShell.

Get-EventLogполучает все события в журнале Windows PowerShell и сохраняет их в переменной$a. $a Затем передайте командлету Select-Object канал. Команда Select-Object использует параметр Index для выбора событий из массива событий в переменной $a . Индекс первого события равен 0. Индекс последнего события — это число элементов в $a минусе 1.

$a = Get-EventLog -LogName "Windows PowerShell"
$a | Select-Object -Index 0, ($A.count - 1)

Пример 7. Выбор всего, кроме первого объекта

В этом примере создается новая psSession на каждом из компьютеров, перечисленных в файлах Servers.txt, за исключением первого.

Select-Object выбирает все компьютеры, кроме первого, в списке имен компьютеров. Результирующий список компьютеров задается в качестве значения параметра ComputerName командлета New-PSSession .

New-PSSession -ComputerName (Get-Content Servers.txt | Select-Object -Skip 1)

Пример 8. Переименование файлов и выбор нескольких для проверки

В этом примере добавляется суффикс -ro в базовые имена текстовых файлов с атрибутом только для чтения, а затем отображаются первые пять файлов, чтобы пользователь смог увидеть пример эффекта.

Get-ChildItem использует динамический параметр ReadOnly для получения файлов только для чтения. Полученные файлы передаются Rename-Item в командлет, который переименовывает файл. Он использует параметр Passthru для отправки Rename-Item переименованных файлов командлету Select-Object , который выбирает первые 5 для отображения.

Параметр Select-ObjectWait предотвращает остановку командлета Get-ChildItem PowerShell после того, как он получит первые пять текстовых файлов только для чтения. Без этого параметра были бы переименованы только первые пять таких файлов.

Get-ChildItem *.txt -ReadOnly |
    Rename-Item -NewName {$_.BaseName + "-ro.txt"} -PassThru |
    Select-Object -First 5 -Wait

Пример 9. Демонстрация тонкостей параметра -ExpandProperty

В этом примере показаны тонкости параметра ExpandProperty .

Обратите внимание, что выходные данные были массивом экземпляров [System.Int32] . Экземпляры соответствуют стандартным правилам форматирования представления вывода. Это верно для всех расширенных свойств. Если выходные объекты имеют определенный стандартный формат, развернутое свойство может не отображаться.

# Create a custom object to use for the Select-Object example.
$object = [pscustomobject]@{Name="CustomObject";Expand=@(1,2,3,4,5)}
# Use the ExpandProperty parameter to Expand the property.
$object | Select-Object -ExpandProperty Expand -Property Name

1
2
3
4
5

# The output did not contain the Name property, but it was added successfully.
# Use Get-Member to confirm the Name property was added and populated.
$object | Select-Object -ExpandProperty Expand -Property Name | Get-Member

TypeName: System.Int32

Name        MemberType   Definition
----        ----------   ----------
CompareTo   Method       int CompareTo(System.Object value), int CompareTo(int value), int IComparable.CompareTo(System.Object obj)...
Equals      Method       bool Equals(System.Object obj), bool Equals(int obj), bool IEquatable[int].Equals(int other)
GetHashCode Method       int GetHashCode()
GetType     Method       type GetType()
GetTypeCode Method       System.TypeCode GetTypeCode(), System.TypeCode IConvertible.GetTypeCode()
ToBoolean   Method       bool IConvertible.ToBoolean(System.IFormatProvider provider)
ToByte      Method       byte IConvertible.ToByte(System.IFormatProvider provider)
ToChar      Method       char IConvertible.ToChar(System.IFormatProvider provider)
ToDateTime  Method       datetime IConvertible.ToDateTime(System.IFormatProvider provider)
ToDecimal   Method       decimal IConvertible.ToDecimal(System.IFormatProvider provider)
ToDouble    Method       double IConvertible.ToDouble(System.IFormatProvider provider)
ToInt16     Method       int16 IConvertible.ToInt16(System.IFormatProvider provider)
ToInt32     Method       int IConvertible.ToInt32(System.IFormatProvider provider)
ToInt64     Method       long IConvertible.ToInt64(System.IFormatProvider provider)
ToSByte     Method       sbyte IConvertible.ToSByte(System.IFormatProvider provider)
ToSingle    Method       float IConvertible.ToSingle(System.IFormatProvider provider)
ToString    Method       string ToString(), string ToString(string format), string ToString(System.IFormatProvider provider)...
ToType      Method       System.Object IConvertible.ToType(type conversionType, System.IFormatProvider provider)
ToUInt16    Method       uint16 IConvertible.ToUInt16(System.IFormatProvider provider)
ToUInt32    Method       uint32 IConvertible.ToUInt32(System.IFormatProvider provider)
ToUInt64    Method       uint64 IConvertible.ToUInt64(System.IFormatProvider provider)
Name        NoteProperty string Name=CustomObject

Пример 10. Создание настраиваемых свойств для объектов

В следующем примере показано, как Select-Object добавить пользовательское свойство в любой объект. При указании имени свойства, которое не существует, Select-Object создается это свойство как NoteProperty для каждого переданного объекта.

$customObject = 1 | Select-Object -Property MyCustomProperty
$customObject.MyCustomProperty = "New Custom Property"
$customObject

MyCustomProperty
----------------
New Custom Property

Пример 11. Создание вычисляемых свойств для каждого объекта InputObject

В этом примере показано использование для Select-Object добавления вычисляемых свойств во входные данные. Передача ScriptBlock в параметр Property приводит Select-Object к оценке выражения для каждого переданного объекта и добавлению результатов в выходные данные. В ScriptBlock можно использовать $_ переменную для ссылки на текущий объект в конвейере.

По умолчанию Select-Object в качестве имени свойства будет использоваться строка ScriptBlock . С помощью хэш-файла можно пометить выходные данные ScriptBlock как пользовательское свойство, добавленное к каждому объекту. Вы можете добавить несколько вычисляемых свойств в каждый переданный Select-Objectобъект.

# Create a calculated property called $_.StartTime.DayOfWeek
Get-Process | Select-Object -Property ProcessName,{$_.StartTime.DayOfWeek}

ProcessName  $_.StartTime.DayOfWeek
----         ----------------------
alg                       Wednesday
ati2evxx                  Wednesday
ati2evxx                   Thursday
...

# Add a custom property to calculate the size in KiloBytes of each FileInfo object you pass in.
# Use the pipeline variable to divide each file's length by 1 KiloBytes
$size = @{label="Size(KB)";expression={$_.length/1KB}}
# Create an additional calculated property with the number of Days since the file was last accessed.
# You can also shorten the key names to be 'l', and 'e', or use Name instead of Label.
$days = @{l="Days";e={((Get-Date) - $_.LastAccessTime).Days}}
# You can also shorten the name of your label key to 'l' and your expression key to 'e'.
Get-ChildItem $PSHOME -File | Select-Object Name, $size, $days

Name                        Size(KB)        Days
----                        --------        ----
Certificate.format.ps1xml   12.5244140625   223
Diagnostics.Format.ps1xml   4.955078125     223
DotNetTypes.format.ps1xml   134.9833984375  223

Параметры

-ExcludeProperty

Указывает свойства, которые этот командлет исключает из операции. Разрешено использовать подстановочные знаки.

Начиная с PowerShell 6, для работы не требуется включать параметр Property для ExcludeProperty .

Type:String[]
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:True

-ExpandProperty

Задает свойство, которое нужно выбрать, и указывает, что нужно попытаться расширить его.

  • Если указанное свойство является массивом, каждое значение массива включается в выходные данные.
  • Если указанное свойство является объектом, свойства объектов расширяются для каждого объекта InputObject.

В любом случае выходные данные типа объектов будут соответствовать типу развернутого свойства.

Если задан параметр Property , Select-Object будет пытаться добавить каждое выбранное свойство в качестве NoteProperty к каждому выходному объекту.

Предупреждение

Если появляется сообщение об ошибке: Select: Свойство не может быть обработано, так как свойство <PropertyName> уже существует, рассмотрим следующее. Обратите внимание, что при использовании -ExpandPropertySelect-Object не удается заменить существующее свойство. Это означает следующее:

  • Если развернутый объект имеет свойство с тем же именем, возникнет ошибка.
  • Если объект Selected имеет свойство того же имени, что и свойство expanded objects, возникнет ошибка.
Type:String
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-First

Указывает число объектов, которое нужно выбрать с начала массива входных объектов.

Type:Int32
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Index

Выбирает объекты из массива в соответствии со значениями индекса. Введите индексы в виде разделенного запятыми списка. Индексы массива начинаются с нуля, то есть 0 представляет первое значение, а (n-1) — последнее значение.

Type:Int32[]
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-InputObject

Указывает объекты, которые необходимо передать в командлет по конвейеру. Этот параметр позволяет передавать объекты в Select-Object.

При передаче объектов в параметр InputObject вместо Select-Object использования конвейера обрабатывает InputObject как один объект, даже если значение является коллекцией. Рекомендуется использовать конвейер при передаче коллекций Select-Objectв .

Type:PSObject
Position:Named
Default value:None
Required:False
Accept pipeline input:True
Accept wildcard characters:False

-Last

Указывает число объектов, которое нужно выбрать с конца массива входных объектов.

Type:Int32
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Property

Указывает свойства, которые нужно выбрать. Эти свойства добавляются в выходные объекты как элементы NoteProperty . Разрешено использовать подстановочные знаки.

Значение параметра Property может быть новым вычисляемым свойством. Чтобы создать вычисляемое свойство, используйте хэш-таблицу.

Допустимые разделы следующие:

  • Имя (или метка) — <string>
  • Выражение — <string> или <script block>

Дополнительные сведения см. в about_Calculated_Properties.

Type:Object[]
Position:0
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:True

-Skip

Пропускает (не выбирает) указанное число элементов. По умолчанию параметр Skip подсчитывается с начала массива или списка объектов, но если команда использует последний параметр, он подсчитывается в конце списка или массива.

В отличие от параметра Index, значение которого отсчитывается от 0, параметр Skip начинается с единицы.

Type:Int32
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-SkipIndex

Type:Int32[]
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-SkipLast

Пропускает (не выбирает) указанное количество элементов в конце списка или массива. Работает так же, как использование Skip вместе с параметром Last .

В отличие от параметра Index , который начинает подсчет с 0, параметр SkipLast начинается с 1.

Type:Int32
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Unique

Указывает, что, если подмножество входных объектов имеет идентичные свойства и значения, выбран будет только один член подмножества.

Уникальные значения выбираются после применения других параметров фильтрации.

Этот параметр чувствителен к регистру. Поэтому строки, которые отличаются только регистром символов, считаются уникальными.

Type:SwitchParameter
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Wait

Указывает, что командлет отключает оптимизацию. PowerShell выполняет команды в том порядке, в котором они отображаются в командном конвейере и позволяют создавать все объекты. По умолчанию при включении Select-Object команды с параметрами First или Index в командном конвейере PowerShell останавливает команду, которая создает объекты сразу после создания выбранного числа объектов.

Этот параметр впервые появился в Windows PowerShell 3.0.

Type:SwitchParameter
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

Входные данные

PSObject

Вы можете передать любой объект в Select-Object.

Выходные данные

PSObject

Примечания

  • Вы также можете ссылаться на Select-Object командлет по встроенному псевдониму. select Дополнительные сведения см. в разделе about_Aliases.

  • Функция оптимизации Select-Object доступна только для команд, которые записывают объекты в конвейер по мере их обработки. Она не действует для команд, которые буферизуют обработанные объекты и записывают их в виде коллекции. При разработке командлетов рекомендуется немедленно записывать объекты. Дополнительные сведения см. в статье "Запись отдельных записей в конвейер" в строго рекомендуемых рекомендациях по разработке.