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
相关产品推荐
相关产品推荐

