Пользовательский вывод PowerShell @ {n =; e =} - PullRequest
1 голос
/ 26 марта 2020

Мне не очень понятно, как работает конструкция @ {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 column :( Может кто-нибудь дать мне несколько советов о том, как работает конструкция @ {n =; e =}? Кроме того, что обозначают n и e?

Ответы [ 2 ]

3 голосов
/ 26 марта 2020
Синтаксис

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

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

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

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

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

1 голос
/ 26 марта 2020

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

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

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


number
------
     1
     2
     3

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...