PowerShell 自定义输出@{n=;e=}

Yor*_*ubs 1 powershell

我不太清楚 @{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)}}
Run Code Online (Sandbox Code Playgroud)

当我尝试做这样的事情时,我永远无法让它发挥作用。这工作正常:

Get-Command -Module Microsoft.Powershell.Utility | Where CommandType -eq Function | Select Name,Version,CommandType
Run Code Online (Sandbox Code Playgroud)

所以我想我会尝试使用该函数的定义添加到一个新列 cat function:\$_.Name

Get-Command -Module Microsoft.Powershell.Utility | Where CommandType -eq Function | Select Name,Version,CommandType,@{n="Contents"; e={cat function:\$_.Name}} 
Run Code Online (Sandbox Code Playgroud)

但我只得到一个空Contents列:( 有人能给我一些关于 @{n=;e=} 构造如何工作的指示吗?还有,nande代表什么?

pro*_*365 5

@{n='';e={}}语法称为计算属性。n 代表名称,e 代表表达式。您甚至可以指定 Name 代替 n 和 Expression 代替 e。

计算属性允许您创建新属性或更改现有属性。这是通过将特殊的哈希表传递给 Property 参数而不是静态属性名称来完成的。这是一个有用的功能,您可以在脚本块中使用自定义表达式创建新属性并使用现有属性。

这不仅适用于 Select-Object,也适用于 Format-Table、Format-List cmdlet。这些在此 cmdlet 之外不起作用。

计算属性是一种操作命令输出以返回您喜欢的任何内容的快速方法。这些可以节省您的时间并减少代码长度。

旁注:您问题中的最后一段代码不起作用,因为您需要使用 Join-Path 连接两条路径。计算属性在这里是无害的。甚至你也可以像这样加入路径:cat "Function:\$($_.Name)"正如@MathiasR.Jessen 指出的那样。