首页/系统/Windows 运维速查/Select-Object 计算属性
PowerShell 基础66 条

Select-Object 计算属性

用哈希表定义新列(名称+计算表达式),把原始属性换算成人类可读的单位或派生值。

Windows 运维速查系统更新于 2026-10-13

计算属性是什么

计算属性是给对象临时算出新的一列:用哈希表写清列名与计算表达式,表达式里用当前对象占位符去取原始属性。它的用处有两个——把原始数据换算成人类看得懂的单位(字节换成兆字节、秒换成小时),以及把多个字段拼成一句可读的说明。因为它不修改原始对象,只影响输出与导出,所以非常适合放在报表的最后一步,也常与排序组合做出资源占用排行。

基本信息

适用平台Windows PowerShell 5.1 与 PowerShell 7 及以上
语法Select-Object @{ Name = '列名'; Expression = { 表达式 }}
简写键名Name 可简写为 n,Expression 可简写为 e,脚本里常用简写
常用场景单位换算、字段拼接、条件分类、取子属性
与普通列混用可与直接书写属性名混在同一次投影里
导出保留计算结果会随对象一起导出,CSV 里保留的是算好的值

典型使用场景

  • 把字节换算成兆字节或吉字节,让容量一眼看出量级
  • 把日期时间格式化成统一写法,便于报表展示与比对
  • 把两个字段拼成标签,例如主机名加进程名
  • 用条件表达式把数值映射成结论文字,如达标与超标
  • 从嵌套属性里取出需要的那一层,避免输出整块内容
  • 与排序组合,生成资源占用的排行榜

常用示例

常用示例
# 字节换算成 MB,保留两位小数
Get-ChildItem C:\Logs -File | Select-Object Name, @{n='MB';e={[math]::Round($_.Length/1MB,2)}}
# 资源排行:先排序再取头部
Get-Process | Sort-Object WS -Descending | Select-Object -First 5 @{n='进程';e={$_.ProcessName}}, @{n='内存MB';e={[math]::Round($_.WS/1MB)}}
# 拼接字段成标签
Get-Service | Select-Object @{n='标签';e={$_.Name + ' | ' + $_.Status}}
# 条件分类
Get-ChildItem D:\Data -File | Select-Object Name, @{n='大小档';e={ if ($_.Length -gt 100MB) { '大' } else { '普通' } }}
# 取子属性
Get-Process | Select-Object Name, @{n='路径';e={$_.Path}}

哈希表键说明

键含义说明
Name 或 n新列显示的名称建议用简洁明确的词,便于导出后识别
Expression 或 e计算表达式必须写在花括号里,并用当前对象占位符取值
FormatString格式化字符串与表达式共用时按格式渲染
Alignment列对齐方式仅影响显示,不影响数据
表达式里必须用当前对象占位符引用属性,漏写会让表达式变成常量,输出一列一模一样的值。写完先用少量数据验证,再上大批量。
中文列名在导出后跨系统传递可能乱码,做系统间数据交换时建议保留英文列名;只在本地报表里用中文。

易错点

  • 表达式没包在花括号里:会按字面字符串输出,看到的是一列相同内容,等于没算
  • 漏写当前对象占位符:表达式变成常量,结果看似正常却毫无意义
  • 在计算列里做重活:表达式对每条记录都执行一次,包含远程调用或磁盘访问时会明显变慢
  • 用中文列名做系统间交换:接收端可能因编码问题显示乱码,交换场景应使用英文列名
  • 把计算列当成原始属性回写:计算属性只存在于输出对象中,不会改变原始数据

数据来源与参考

  • Microsoft Learn:Select-Object(Calculated Properties)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌