Суть в том, чтобы заполнить переменную именем свойства объекта Powershell, отображаемым в консоли.
Это означает, что если я запускаю Get-Process
, я хочу, чтобы в консоли возвращались только восемь свойств объекта, которые являются «Обрабатывает NPM (K) PM (K) WS (K) CPU (s) Id SI ProcessName».
Команда Get-Member
здесь бесполезна.
Может ли кто-нибудь помочь мне с этим?
Спасибо вам всем!
Спасибо за ваш ответ Матиас. Думаю, я могу сделать это с помощью Out-String
. Я прав?
если вам нужны только эти свойства ... то либо Select-Object
их, либо сделайте [PSCustomObject]
с нужными реквизитами.
@Charlypop Нет, Out-String
дает вам одну большую многострочную строку. Я говорю именно о том, о чем вы просите, например, о создании надлежащего объекта со свойством «WS (K)», но значение, хранящееся в $object.'WS(K)'
, будет нить"24.5"
вместо десятичного значения 24.5
. Будет ли это работать?
Суть в том, чтобы сделать вывод динамичным. Я также могу захотеть получить имена свойств из команды Get-Service
, но дело в том, что я не хочу думать о том, какие свойства выводить. Select-Object
заставит меня перечислить свойства, так что $object.PROPERTY
. Надеюсь, это ясно для вас
Get-FormatData System.Diagnostics.Process
предоставит вам всю информацию, но, как уже писал @MathiasR.Jessen, это дает вам только строковое представление свойств, предназначенное только для отображения. На это нельзя полагаться — форматирование может даже измениться в будущих версиях PowerShell. Какая здесь более широкая картина, для чего вам нужны эти свойства?
@zett42, в основном для культуры
@Charlypop, Матиас отметил, что просто получение столбца имена может быть не тем, что вы искали - см. обновленный ответ (новый средний раздел).
Чтобы получить Имена столбец — который может быть или не быть именами свойство — вид таблицы, который представлен для данного типа .NET если у него есть данные предопределенного форматирования (который включает табличное представление), связанного с ним:
Select-Object
для создания пользовательских объектов, имеющих свойства с теми же значениями, что и данные форматирования.# Determine the .NET type of interest.
$type = (Get-Process)[0].GetType()
# Extract the names of the column headers from the *first* table-view definition.
Get-FormatData $type -PowerShellVersion $PSVersionTable.PSVersion |
ForEach-Object FormatViewDefinition |
Where-Object Control -is [System.Management.Automation.TableControl] |
Select-Object -First 1 |
ForEach-Object {
$i = 0
$rows = $_.Control.Rows
foreach ($colLabel in $_.Control.Headers.Label) {
if ($colLabel) { $colLabel } # Explicit label, with a calculated column value or renamed property
else { $rows.Columns[$i].DisplayEntry.Value } # Property name, with its value as the column value.
++$i
}
}
Предостережение: приведенный выше вывод ограничивается найденным определением табличного представления первый, которое может применяться или не применяться к данной команде. Выбор определения по умолчанию потенциально регулируется критериями, связанными с определениями, которые выбираются на основе условий выполнения, включая выбор по конкретному типу ввода, при условии, что один экземпляр данных форматирования может охватывать типы несколько.
Также обратите внимание, что представления могут включать группировка (как вы видите, например, в форматированном выводе Get-ChildItem
), а критерий группировки не охватывается приведенной выше командой.
Обратите внимание, что даже для одного типа может быть определен несколько просмотров, и чтобы использовать тип, отличный от значения по умолчанию, вы должны запросить его явно через параметр Format-Table
-View
, предполагая, что вы знаете имя, [1] например. Get-Process | Format-Table -View StartTime)
.
Get-FormatData
в Export-FormatData
, чтобы экспортировать данные форматирования в файл XML, который имеет тот недостаток, что его трудно читать, но имеет преимущество в соответствии со схемой XML, используемой для данных форматирования авторский — см. следующий пункт — тогда как типы в памяти, используемые для представления данных форматирования, частично используют имена свойств, которые не соответствуют базовым элементам XML.*.Format.ps1xml
):
Примечание:
Использование -PowerShellVersion $PSVersionTable.PSVersion
с Get-FormatData
необходимо только в Windows PowerShell для определенных типов, чтобы обойти ошибку, которой больше нет в PowerShell (ядро) 7.1+.
Хотя имена столбецобычно соответствуют именам свойство форматируемых экземпляров типа, это не всегда так, например, с экземплярами [System.Diagnostics.Process]
, выводимыми Get-Process
.
Если с данным типом связаны предопределенные данные форматирования нет (в этом случае Get-FormatData
означает отсутствие операций):
Имена его (общедоступных) свойств экземпляра используются в качестве столбца имена.
Вы получаете представление Таблица по умолчанию, только если есть 4 или меньше свойств, но вы можете запросить его явно с помощью Format-Table
(с 5 и более свойств по умолчанию применяется Format-List
).
Чтобы получить имена всех (общедоступных) свойств экземпляра данного объекта, используйте внутреннее .psobject
свойство, который является богатым источником отражения; например.:
(Get-Process | Select-Object -First 1).psobject.Properties.Name
Чтобы создать список имен свойств и рассчитанные свойства, которые можно использовать с Select-Object
, которые отражают определение столбца данных форматирования:
# Determine the .NET type of interest.
$type = (Get-Process)[0].GetType()
# Get an array of property names / calculated properties from the
# formatting data, for later use with Select-Object
$props =
Get-FormatData $type -PowerShellVersion $PSVersionTable.PSVersion |
ForEach-Object FormatViewDefinition |
Where-Object Control -Is [System.Management.Automation.TableControl] |
Select-Object -First 1 |
ForEach-Object {
$i = 0
$rows = $_.Control.Rows
foreach ($colLabel in $_.Control.Headers.Label) {
if ($colLabel) { # Explicit label, with a calculated column value or renamed property
@{
Name = $colLabel
Expression = if ('ScriptBlock' -eq $rows.Columns[$i].DisplayEntry.ValueType) {
[scriptblock]::Create($rows.Columns[$i].DisplayEntry.Value)
} else {
$rows.Columns[$i].DisplayEntry.Value
}
}
}
else { # Property name, with its value as the column value.
$rows.Columns[$i].DisplayEntry.Value
}
++$i
}
}
# Sample call
Get-Process | Select-Object -Property $props | Format-Table | more
Пример вызова производит аналогичный вывод только Get-Process
, поскольку он использует определения столбцов как (вычисляемые) свойства, хотя и со значениями по умолчанию для атрибутов форматирования, таких как ширина столбца и выравнивание.
Обратите внимание на явное использование Format-Table
для обеспечения вывода табличный; без него - учитывая, что экземпляры [pscustomobject]
, созданные Select-Object
, не имеют связанных с ними данных форматирования - получится форматирование список (подразумеваемое Format-List
).
Как указывает Матиас, свойства рассчитанный будут типизированы по типу нить даже для столбцов, основанных на свойствах числовой, потому что их назначение в данных форматирования — создание форматированных строковых представлений.
Быстрое решение для получения только имена столбцов:
Далее используется Out-String
-Stream
в сочетании с Select-String
для извлечения имен столбцов из форматированного вывода данной команды, который основан на двух предположениях:
Format-Table
перед Out-String
.Get-Process | Out-String -Stream | Select-String -List '^\s*--+' -Context 1, 0 |
ForEach-Object { -split $_.Context.PreContext[0] }
Выход:
NPM(K)
PM(M)
WS(M)
CPU(s)
Id
SI
ProcessName
Примечание. В Windows PowerShell отображается дополнительное свойство, как и первое: Handles
.
[1] While tab-completion does offer view names, they appear to be out of sync with the actually available ones, as of PowerShell 7.2.2. To see the latter, provoke an error with a dummy name, and the error message will list the available ones; e.g. Get-Process | Format-Table -View NoSuch
lists the following available views in the resulting error message: process, Priority, StartTime
Отличный ответ mklement0! особенно первый фрагмент кода, чтобы лучше понять, как форматирование по умолчанию строится для разных типов объектов.
Вы могу извлекаете данные форматирования, которые PowerShell внутренне использует для представления таблицы Process, но все значения свойств (даже числовые) будут преобразованы в струны, что несколько ограничивает их полезность. Вам бы это еще пригодилось?