Select-Object (Microsoft.PowerShell.Utility)
Select-Object
- Модуль:
- Microsoft.PowerShell.Utility
Выбирает объекты или свойства объекта.
Синтаксис
Select-Object
[-InputObject <PSObject>]
[[-Property] <Object[]>]
[-ExcludeProperty <String[]>]
[-ExpandProperty <String>]
[-Unique]
[-CaseInsensitive]
[-Last <Int32>]
[-First <Int32>]
[-Skip <Int32>]
[-Wait]
[<CommonParameters>]Select-Object
[-InputObject <PSObject>]
[[-Property] <Object[]>]
[-ExcludeProperty <String[]>]
[-ExpandProperty <String>]
[-Unique]
[-CaseInsensitive]
[-Skip <Int32>]
[-SkipLast <Int32>]
[<CommonParameters>]Select-Object
[-InputObject <PSObject>]
[-Unique]
[-CaseInsensitive]
[-Wait]
[-Index <Int32[]>]
[<CommonParameters>]Select-Object
[-InputObject <PSObject>]
[-Unique]
[-CaseInsensitive]
[-SkipIndex <Int32[]>]
[<CommonParameters>]Описание
Командлет Select-Object выбирает указанные свойства объекта или набора объектов. Он также может выбирать уникальные объекты, определенное количество объектов или объекты в указанной позиции в массиве.
Чтобы выбрать объекты из коллекции, используйте Первый, Последний, Уникальный, Пропустить и Индекс. параметры. Чтобы выбрать свойства объекта, используйте параметр Property. Когда вы выбираете свойства, Select-Object возвращает новые объекты, имеющие только указанные свойства.
Начиная с Windows PowerShell 3.0, Select-Object включает функцию оптимизации, которая не позволяет командам создавать и обрабатывать объекты, которые не используются.
Когда вы используете Select-Object с параметрами First или Index в командном конвейере, PowerShell останавливает команду, которая генерирует объекты, как только выбранное количество объектов достигнуто. Чтобы отключить такое поведение оптимизации, используйте параметр Wait.
Примеры
Пример 1. Выбор объектов по свойству
В этом примере создаются объекты, имеющие свойства Имя, 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 выбирает имена процессов. Это добавляет ProcessName NoteProperty к каждому экземпляру [System.Diagnostics.ProcessModule] и заполняет его значением 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. Выбор уникальных символов из массива
В этом примере используется параметр Unique Select-Object для получения уникальных символов из массива символов.
"a","b","c","a","A","a" | Select-Object -Unique
a
b
c
AПример 5: Использование `-Unique` с другими параметрами
Параметр Unique фильтрует значения после применения других параметров Select-Object. Например, если вы используете параметр First для выбора первого количества элементов в массиве, параметр Unique применяется только к выбранным значениям, а не ко всему массиву.
"a","a","b","c" | Select-Object -First 2 -Unique
aВ этом примере First выбирает "a","a" в качестве первых двух элементов массива. Unique применяется к "a","a" и возвращает a в качестве уникального значения.
Пример 6. Выбор уникальных строк с помощью параметра «-CaseInsensitivity».
В этом примере используются сравнения без учета регистра для получения уникальных строк из массива строк.
"aa", "Aa", "Bb", "bb" | Select-Object -Unique -CaseInsensitive
aa
BbПример 7. Выбор самых новых и самых старых событий в журнале событий.
В этом примере получаются первое (самое новое) и последнее (самое старое) события в журнале событий Windows PowerShell.
Get-WinEvent получает все события из журнала Windows PowerShell и сохраняет их в переменной $a. Затем $a передается по конвейеру командлету Select-Object. Команда Select-Object использует параметр Index для выбора событий из массива событий в переменной $a. Индекс первого события равен 0. Индекс последнего события равен количеству элементов в $a минус 1.
$a = Get-WinEvent -LogName "Windows PowerShell"
$a | Select-Object -Index 0, ($a.count - 1)Пример 8. Выбрать все объекты, кроме первого.
В этом примере создается новый сеанс PSSession на каждом из компьютеров, перечисленных в файлах Servers.txt, за исключением первого.
Select-Object выбирает все компьютеры, кроме первого, в списке имен компьютеров. Результирующий список компьютеров задается как значение параметра ComputerName командлета New-PSSession.
New-PSSession -ComputerName (Get-Content Servers.txt | Select-Object -Skip 1)Пример 9. Переименуйте файлы и выберите несколько для просмотра.
В этом примере к базовым именам текстовых файлов, имеющих атрибут «только для чтения», добавляется суффикс «-ro», а затем отображаются первые пять файлов, чтобы пользователь мог увидеть образец эффекта.
Get-ChildItem использует динамический параметр ReadOnly для получения файлов, доступных только для чтения. Полученные файлы передаются командлету Rename-Item, который переименовывает файл. Он использует параметр PassThru Rename-Item для отправки переименованных файлов в командлет Select-Object, который выбирает первые 5 файлов для отображения.
Параметр Wait Select-Object не позволяет PowerShell остановить командлет Get-ChildItem после того, как он получит первые пять текстовых файлов, доступных только для чтения. Без этого параметра будут переименованы только первые пять файлов, доступных только для чтения.
Get-ChildItem *.txt -ReadOnly |
Rename-Item -NewName {$_.BaseName + "-ro.txt"} -PassThru |
Select-Object -First 5 -WaitПример 10. Покажите тонкости параметра -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), ...
Equals Method bool Equals(System.Object obj), bool Equals(int obj), bool IEq...
GetHashCode Method int GetHashCode()
GetType Method type GetType()
GetTypeCode Method System.TypeCode GetTypeCode(), System.TypeCode IConvertible.Ge...
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 ToS...
ToType Method System.Object IConvertible.ToType(type conversionType, System...
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Пример 11. Создание пользовательских свойств объектов
В следующем примере показано использование Select-Object для добавления пользовательского свойства к любому объекту. Если вы указываете несуществующее имя свойства, Select-Object создает это свойство как NoteProperty для каждого переданного объекта.
$customObject = 1 | Select-Object -Property MyCustomProperty
$customObject.MyCustomProperty = "New Custom Property"
$customObject
MyCustomProperty
----------------
New Custom PropertyПример 12. Создайте вычисляемые свойства для каждого InputObject.
В этом примере показано использование Select-Object для добавления вычисляемых свойств к входным данным. Передача ScriptBlock в параметр Property приводит к тому, что Select-Object оценивает выражение для каждого переданного объекта и добавляет результаты в выходные данные. В ScriptBlock вы можете использовать переменную $_ для ссылки на текущий объект в конвейере.
По умолчанию Select-Object использует строку ScriptBlock в качестве имени свойства. Используя Hashtable, вы можете пометить выходные данные вашего 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Пример 13. Выбор ключей хеш-таблицы без использования вычисляемых свойств.
Начиная с PowerShell 6, Select-Object поддерживает выбор ключей ввода hashtable в качестве свойств. В следующем примере выбираются ключи weight и name во входной хэш-таблице и отображаются выходные данные.
@{ name = 'a' ; weight = 7 } | Select-Object -Property name, weight
name weight
---- ------
a 7Пример 14: ExpandProperty изменяет исходный объект
В этом примере демонстрируется побочный эффект использования параметра ExpandProperty. При использовании ExpandProperty Select-Object добавляет выбранные свойства к исходному объекту как элементы NoteProperty.
PS> $object = [PSCustomObject]@{
name = 'USA'
children = [PSCustomObject]@{
name = 'Southwest'
}
}
PS> $object
name children
---- --------
USA @{name=Southwest}
# Use the ExpandProperty parameter to expand the children property
PS> $object | Select-Object @{n="country"; e={$_.name}} -ExpandProperty children
name country
---- -------
Southwest USA
# The original object has been altered
PS> $object
name children
---- --------
USA @{name=Southwest; country=USA}Как видите, свойство country было добавлено к объекту children после использования параметра ExpandProperty.
Пример 15. Создайте новый объект с расширенными свойствами без изменения входного объекта.
Вы можете избежать побочного эффекта использования параметра ExpandProperty, создав новый объект и скопировав свойства из входного объекта.
PS> $object = [PSCustomObject]@{
name = 'USA'
children = [PSCustomObject]@{
name = 'Southwest'
}
}
PS> $object
name children
---- --------
USA @{name=Southwest}
# Create a new object with selected properties
PS> $newobject = [PSCustomObject]@{
country = $object.name
children = $object.children
}
PS> $newobject
country children
------- --------
USA @{name=Southwest}
# $object remains unchanged
PS> $object
name children
---- --------
USA @{name=Southwest}Параметры
-CaseInsensitive
По умолчанию, когда вы используете параметр Unique, командлет использует сравнения с учетом регистра. При использовании этого параметра командлет использует сравнения без учета регистра.
Этот параметр был добавлен в PowerShell 7.4.
- Тип :
SwitchParameter
- Позиция:
Именованный
- Значение по умолчанию:
False
- Необходимый:
False
- Примите ввод конвейера:
False
- Принимайте подстановочные знаки:
False
-ExcludeProperty
Указывает свойства, которые этот командлет исключает из операции. Подстановочные знаки разрешены.
Начиная с PowerShell 6, для работы ExcludeProperty больше не требуется включать параметр Property.
- Тип :
String[]
- Позиция:
Именованный
- Значение по умолчанию:
None
- Необходимый:
False
- Примите ввод конвейера:
False
- Принимайте подстановочные знаки:
True
-ExpandProperty
Указывает свойство для выбора и указывает, что следует попытаться расширить это свойство. Если в конвейере входных объектов нет указанного свойства, Select-Object возвращает ошибку.
- Если указанное свойство является массивом, каждое значение массива включается в выходные данные.
- Если указанное свойство является объектом, свойства объекта раскрываются для каждого InputObject.
В любом случае Тип выходных объектов соответствует Тип расширенного свойства.
Примечание
При использовании ExpandProperty возникает побочный эффект. Select-Object добавляет выбранные свойства к исходному объекту как элементы NoteProperty.
Если указан параметр Property, Select-Object пытается добавить каждое выбранное свойство как NoteProperty к каждому выводимому объекту.
Предупреждение
Если вы получаете сообщение об ошибке, сообщающее, что свойство невозможно обработать, поскольку свойство с таким именем уже существует, учтите следующее. Обратите внимание, что при использовании ExpandProperty Select-Object не может заменить существующее свойство. Это означает:
- Если развернутый объект имеет свойство с таким же именем, команда возвращает ошибку.
- Если объект Выбранный имеет свойство с тем же именем, что и свойство объекта Расширенный, команда возвращает ошибку.
- Тип :
String
- Позиция:
Именованный
- Значение по умолчанию:
None
- Необходимый:
False
- Примите ввод конвейера:
False
- Принимайте подстановочные знаки:
False
-First
Указывает количество объектов, которые необходимо выбрать из начала массива входных объектов.
- Тип :
Int32
- Позиция:
Именованный
- Значение по умолчанию:
None
- Необходимый:
False
- Примите ввод конвейера:
False
- Принимайте подстановочные знаки:
False
-Index
Выбирает объекты из массива на основе значений их индексов. Введите индексы в виде списка, разделенного запятыми. Индексы в массиве начинаются с 0, где 0 представляет первое значение, а (n-1) — последнее значение.
- Тип :
Int32[]
- Позиция:
Именованный
- Значение по умолчанию:
None
- Необходимый:
False
- Примите ввод конвейера:
False
- Принимайте подстановочные знаки:
False
-InputObject
Указывает объекты для отправки командлету через конвейер. Этот параметр позволяет передавать объекты по конвейеру в Select-Object.
Когда вы передаете объекты в параметр InputObject, вместо использования конвейера Select-Object обрабатывает InputObject как один объект, даже если значение представляет собой коллекцию. Рекомендуется использовать конвейер при передаче коллекций в Select-Object.
- Тип :
PSОбъект
- Позиция:
Именованный
- Значение по умолчанию:
None
- Необходимый:
False
- Примите ввод конвейера:
True
- Принимайте подстановочные знаки:
False
-Last
Указывает количество объектов, которые необходимо выбрать из конца массива входных объектов.
- Тип :
Int32
- Позиция:
Именованный
- Значение по умолчанию:
None
- Необходимый:
False
- Примите ввод конвейера:
False
- Принимайте подстановочные знаки:
False
-Property
Указывает свойства для выбора. Эти свойства добавляются как элементы NoteProperty к выходным объектам. Подстановочные знаки разрешены. Если входной объект не имеет указанного свойства, значение нового NoteProperty устанавливается равным $null.
Значение параметра Property может быть новым вычисляемым свойством. Чтобы создать вычисляемое свойство, используйте хеш-таблицу.
Действительные ключи:
- Имя (или метка) —
<string> - Выражение —
<string>или<script; block>
Дополнительные сведения см. в разделе about_Calculated_Properties.
- Тип :
Object[]
- Позиция:
0
- Значение по умолчанию:
None
- Необходимый:
False
- Примите ввод конвейера:
False
- Принимайте подстановочные знаки:
True
-Skip
Пропускает (не выбирает) указанное количество элементов. По умолчанию параметр Пропустить отсчитывает от начала коллекции объектов. Если команда использует параметр Last, отсчет ведется с конца коллекции.
В отличие от параметра Index, отсчет которого начинается с 0, параметр Skip начинается с 1.
Начиная с PowerShell 7.4, вы можете использовать параметр Skip с параметром SkipLast, чтобы пропускать элементы как с начала, так и с конца коллекции.
- Тип :
Int32
- Позиция:
Именованный
- Значение по умолчанию:
None
- Необходимый:
False
- Примите ввод конвейера:
False
- Принимайте подстановочные знаки:
False
-SkipIndex
Пропускает (не выбирает) объекты из массива на основе значений их индексов. Введите индексы в виде списка, разделенного запятыми. Индексы в массиве начинаются с 0, где 0 представляет первое значение, а (n-1) — последнее значение.
Этот параметр был введен в Windows PowerShell 6.0.
- Тип :
Int32[]
- Позиция:
Именованный
- Значение по умолчанию:
None
- Необходимый:
False
- Примите ввод конвейера:
False
- Принимайте подстановочные знаки:
False
-SkipLast
Пропускает (не выбирает) указанное количество элементов из конца списка или массива. Работает так же, как использование Skip вместе с параметром Last.
В отличие от параметра Index, отсчет которого начинается с 0, параметр SkipLast начинается с 1.
Начиная с PowerShell 7.4, вы можете использовать параметр Skip с параметром SkipLast, чтобы пропускать элементы как с начала, так и с конца коллекции.
- Тип :
Int32
- Позиция:
Именованный
- Значение по умолчанию:
None
- Необходимый:
False
- Примите ввод конвейера:
False
- Принимайте подстановочные знаки:
False
-Unique
Указывает, что если подмножество входных объектов имеет идентичные свойства и значения, следует выбрать только один член подмножества.
Уникальный выбирает значения после применения других параметров фильтрации.
Этот параметр чувствителен к регистру. В результате строки, отличающиеся только регистром символов, считаются уникальными. Добавьте параметр CaseInsensitivity, чтобы выполнять сравнения без учета регистра.
- Тип :
SwitchParameter
- Позиция:
Именованный
- Значение по умолчанию:
None
- Необходимый:
False
- Примите ввод конвейера:
False
- Принимайте подстановочные знаки:
False
-Wait
Указывает, что командлет отключает оптимизацию. PowerShell запускает команды в том порядке, в котором они появляются в командном конвейере, и позволяет им генерировать все объекты. По умолчанию, если вы включаете команду Select-Object с параметрами First или Index в командный конвейер, PowerShell останавливает команду, генерирующую объекты, как только будет сгенерировано выбранное количество объектов.
Этот параметр был введен в Windows PowerShell 3.0.
- Тип :
SwitchParameter
- Позиция:
Именованный
- Значение по умолчанию:
None
- Необходимый:
False
- Примите ввод конвейера:
False
- Принимайте подстановочные знаки:
False
Входы
PSObject
Вы можете передавать объекты в этот командлет.
Выходы
PSObject
Этот командлет возвращает входные объекты только с выбранными свойствами.
Примечания
PowerShell включает следующие псевдонимы для Select-Object:
Все платформы:
select
Функция оптимизации Select-Object доступна только для команд, которые записывают объекты в конвейер по мере их обработки. Это не влияет на команды, которые буферизуют обработанные объекты и записывают их как коллекцию. Немедленная запись объектов — это лучшая практика проектирования командлетов. Дополнительную информацию см. в разделе Запись отдельных записей в конвейер в Настоятельно рекомендуемых рекомендациях по разработке.