Преобразование объекта в модифицированный объект с новыми свойствами Печать

Создание новых свойств (property) объектов необходимо для:

  • удобочитаемости
  • передачи по конвейеру (в случае, если принимающий командлет содержит иное имя свойства, чем вывод передающего командлета)

 

Преобразуем параметр "VM" объектов Process в параметр с новым именем "VirtualMemory(MB)" и выведем его в Мегабайтах, а также параметр "PM" в "PagedMemory(MB)" и тоже выведем в Мегабайтах.

# Без преобразования
PS C:\> Get-Process -Name 'powershell*' | Select-Object -Property Name,Id,VM,PM

Name                   Id         VM        PM
----                   --         --        --
powershell          14024 4294967295  60260352
powershell          15524 4294967295  69124096
powershell_ise       9572  778027008 165224448


# После преобразования
PS C:\> Get-Process -Name 'powershell*' | `
             Select-Object -Property `
                Name, `
                Id, `
                @{name='VirtualMemory(MB)';expression={'{0:N2}' –f ($PSItem.VM / 1MB) }}, `
                @{n='PagedMemory(MB)';e={'{0:N2}' –f ($_.PM / 1MB) }}

Name                   Id VirtualMemory(MB) PagedMemory(MB)
----                   -- ----------------- ---------------
powershell          14024 4 096,00          57,47          
powershell          15524 4 096,00          65,92          
powershell_ise       9572 741,98            157,57         

 

Преобразуем параметр "Name" объекта ADComputer в новый параметр с именем "ComputerName".

Допустим вы хотите выбрать из Active Directory список компьютеров и посмотреть запущенные процессы на них. В этом случае следующий командлет выдаст вам ошибку:

PS C:\> Get-ADComputer -Filter * | Get-Process   # This is the wrong example and it entails an error

Это потому, что вывод передающего командета Get-ADComputer выдаст нужное нам для передачи по конвейеру свойство с именем "Name". Ввод же через PipeLine для командлета Get-Process осуществляется через свойство с именем "ComputerName".
Т.е. нам нужно переименовать свойство передающего командлета в подходящее имя для принимающего командлета. Значение же исходного свойства в этот раз мы не меняем:

 

PS C:\> Get-ADComputer -Filter * | Select-Object @{n='ComputerName';e={$_.Name}} | Get-Process   # This is the correct instance