You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell中调换创建时间与文件名拼接顺序后输出为空的原因?

PowerShell中Select-Object自定义属性顺序导致输出为空的原因

我获取了文件列表并尝试展示,仅希望显示文件名和创建时间。原本实现了功能,但为了对齐效果,想让创建时间在前、文件名在后。我不想使用多列对齐,也绝对不想添加控制名称与时间间空格数的逻辑。但令我惊讶的是两段代码表现不同:第一段正常输出,第二段全部为空。

$list = Get-ChildItem "."

$list `
  | Sort-Object CreationTime `
  | Select-Object @{Name=" "; Expression={$_.BaseName + "   " + $_.CreationTime}}

$list `
  | Sort-Object CreationTime `
  | Select-Object @{Name=" "; Expression={$_.CreationTime + "   " + $_.BaseName}}

原因分析

问题核心在于PowerShell的类型转换优先级规则:

  • 第一段代码中,$_.BaseName是字符串类型,当它与$_.CreationTime(DateTime类型)拼接时,PowerShell会自动将DateTime对象转换为字符串,最终生成合法的字符串结果,所以能正常输出。
  • 第二段代码中,表达式以DateTime类型的$_.CreationTime开头,PowerShell会默认尝试将整个表达式的结果按DateTime类型处理。但后续拼接的" " + $_.BaseName是纯字符串,无法被转换为DateTime类型,最终导致整个表达式返回$null,因此输出全部为空。

解决方法

只需要显式将DateTime对象转为字符串即可,两种常见写法:

# 用字符串插值强制转换
$list `
  | Sort-Object CreationTime `
  | Select-Object @{Name=" "; Expression={"$($_.CreationTime)   " + $_.BaseName}}

或者:

# 调用ToString()方法
$list `
  | Sort-Object CreationTime `
  | Select-Object @{Name=" "; Expression={$_.CreationTime.ToString() + "   " + $_.BaseName}}

内容的提问来源于stack exchange,提问作者Konrad Viltersten

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 23:15:59