Powershell - получить свойства объекта, отображаемые в консоли

Суть в том, чтобы заполнить переменную именем свойства объекта Powershell, отображаемым в консоли. Это означает, что если я запускаю Get-Process, я хочу, чтобы в консоли возвращались только восемь свойств объекта, которые являются «Обрабатывает NPM (K) PM (K) WS (K) CPU (s) Id SI ProcessName».

Команда Get-Member здесь бесполезна.

Может ли кто-нибудь помочь мне с этим?

Спасибо вам всем!

Вы могу извлекаете данные форматирования, которые PowerShell внутренне использует для представления таблицы Process, но все значения свойств (даже числовые) будут преобразованы в струны, что несколько ограничивает их полезность. Вам бы это еще пригодилось?

Mathias R. Jessen 19.03.2022 10:28

Спасибо за ваш ответ Матиас. Думаю, я могу сделать это с помощью Out-String. Я прав?

Charlypop 19.03.2022 10:38

если вам нужны только эти свойства ... то либо Select-Object их, либо сделайте [PSCustomObject] с нужными реквизитами.

Lee_Dailey 19.03.2022 10:47

@Charlypop Нет, Out-String дает вам одну большую многострочную строку. Я говорю именно о том, о чем вы просите, например, о создании надлежащего объекта со свойством «WS (K)», но значение, хранящееся в $object.'WS(K)', будет нить"24.5" вместо десятичного значения 24.5. Будет ли это работать?

Mathias R. Jessen 19.03.2022 11:17

Суть в том, чтобы сделать вывод динамичным. Я также могу захотеть получить имена свойств из команды Get-Service, но дело в том, что я не хочу думать о том, какие свойства выводить. Select-Object заставит меня перечислить свойства, так что $object.PROPERTY. Надеюсь, это ясно для вас

Charlypop 19.03.2022 12:35
Get-FormatData System.Diagnostics.Process предоставит вам всю информацию, но, как уже писал @MathiasR.Jessen, это дает вам только строковое представление свойств, предназначенное только для отображения. На это нельзя полагаться — форматирование может даже измениться в будущих версиях PowerShell. Какая здесь более широкая картина, для чего вам нужны эти свойства?
zett42 19.03.2022 13:20

@zett42, в основном для культуры

Charlypop 19.03.2022 14:47

@Charlypop, Матиас отметил, что просто получение столбца имена может быть не тем, что вы искали - см. обновленный ответ (новый средний раздел).

mklement0 20.03.2022 21:52
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
8
80
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы получить Имена столбец — который может быть или не быть именами свойствовид таблицы, который представлен для данного типа .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.
    • Что касается данных форматирования авторский, для которых в PowerShell 7.2.2 требуется XML-файлы (*.Format.ps1xml):

Примечание:

  • Использование -PowerShellVersion $PSVersionTable.PSVersion с Get-FormatData необходимо только в Windows PowerShell для определенных типов, чтобы обойти ошибку, которой больше нет в PowerShell (ядро) 7.1+.

  • Хотя имена столбецобычно соответствуют именам свойство форматируемых экземпляров типа, это не всегда так, например, с экземплярами [System.Diagnostics.Process], выводимыми Get-Process.

    • общее предостережение, как отмечает Зетт42, заключается в том, что отображать форматирование типов не является частью публичного контракта в отношении критических изменений, поэтому определения форматирования могут меняться с течением времени.
  • Если с данным типом связаны предопределенные данные форматирования нет (в этом случае Get-FormatData означает отсутствие операций):

    • Имена его (общедоступных) свойств экземпляра используются в качестве столбца имена.

    • Вы получаете представление Таблица по умолчанию, только если есть 4 или меньше свойств, но вы можете запросить его явно с помощью Format-Table5 и более свойств по умолчанию применяется 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! особенно первый фрагмент кода, чтобы лучше понять, как форматирование по умолчанию строится для разных типов объектов.

Santiago Squarzon 19.03.2022 19:39

Другие вопросы по теме