Пользовательский вывод PowerShell @ {n =; e =}

Мне не очень понятно, как работает конструкция @ {n =; e =} в PowerShell. У этого типа вещей есть имя, из которого я могу найти примеры?

Например, я нахожу такие примеры, которые прекрасно работают:

gwmi win32_logicaldisk | Format-Table DeviceId, VolumeName, @{n="Size(GB)";e={[math]::Round($_.Size/1GB,2)}},@{n="Free(GB)";e={[math]::Round($_.FreeSpace/1GB,2)}}

Когда я пытаюсь сделать что-то подобное, я никогда не могу заставить это работать. Это прекрасно работает:

Get-Command -Module Microsoft.Powershell.Utility | Where CommandType -eq Function | Select Name,Version,CommandType

Поэтому я решил добавить определение этой функции в новый столбец с помощью cat function:$_.Name

Get-Command -Module Microsoft.Powershell.Utility | Where CommandType -eq Function | Select Name,Version,CommandType,@{n="Contents"; e={cat function:$_.Name}} 

Но я просто получаю пустой столбец Contents :( Кто-нибудь может дать мне несколько советов о том, как работает конструкция @ {n =; e =}? Кроме того, что обозначают n и e ?

Всего 2 ответа


Синтаксис @{n='';e={}} называется вычисляемым свойством. n обозначает имя, а e обозначает выражение. Вы даже можете указать Имя вместо n и Выражение вместо e.

Рассчитанные свойства позволяют создавать новые свойства или изменять существующие. Это делается путем передачи специальной хеш-таблицы параметру Property вместо статического имени свойства. Это полезная функция, где вы создаете новые свойства, используя пользовательское выражение в блоке скрипта, и используете существующие свойства.

Не только для Select-Object, но и для командлетов Format-Table, Format-List. Они не работают вне этих командлетов.

Вычисляемые свойства - это быстрый способ манипулировать выводом команды, чтобы возвращать практически все, что вам нравится. Это экономит ваше время и уменьшает длину кода.

Sidenote: последний код в вашем вопросе не работает, потому что вам нужно объединить два пути, используя Join-Path. Рассчитанные свойства здесь невинны. Даже вы можете присоединиться к пути следующим образом: cat "Function:$($_.Name)" как указал @ MathiasR.Jessen.


@{} это хеш-таблица. {} - это скрипт-блок внутри хеш-таблицы, равный e. Хеш-таблица используется для select-объекта.

$scriptblock = { $_ } 
$hashtable = @{ name = 'number'
          expression = $scriptblock
              }

1..3 | select-object -property $hashtable


number
------
     1
     2
     3


Есть идеи?

10000