PowerShell导出文件查询结果到txt时格式异常如何解决
PowerShell导出最小文件列表格式异常修复
问题现象
编写递归查找体积最小2个文件的PowerShell脚本时,导出的txt内容显示为结构化对象的默认字符串格式,无法清晰查看文件名与对应大小:
原脚本代码:
$checksize = gci -r| sort -descending -property length | select -last 2 name, length | Add-Content -Path C:\log.txt
导出的异常内容:
@{Name=fileexample.txt; Length=3482342} @{Name=server.iso; Length=548238474}
问题原因
直接将Select-Object返回的自定义对象管道传给Add-Content时,PowerShell会默认调用对象的ToString()方法做转换,最终输出的就是你看到的@{属性=值}类型标记格式,并非可读的结构化展示。另外原脚本存在两个逻辑瑕疵:
- 未加
-File参数,递归结果会包含目录对象,目录无有效Length属性,会干扰排序结果 - 采用降序排序取最后2个的写法,逻辑等价于升序取前2个,但可读性较差
修复方案
方案1:导出为可读表格格式
直接用Out-File接收格式化后的对象输出,会自动生成对齐的纯文本表格,适合快速查看:
Get-ChildItem -Recurse -File | Sort-Object -Property Length | Select-Object -First 2 Name, Length | Out-File -FilePath C:\log.txt -Encoding utf8
导出效果示例:
Name Length ---- ------ fileexample.txt 3482342 test.txt 1234
方案2:自定义每行输出格式
如果需要自定义展示字段、文字描述,可以遍历对象手动拼接字符串后写入,灵活度更高:
Get-ChildItem -Recurse -File | Sort-Object -Property Length | Select-Object -First 2 Name, Length | ForEach-Object { "文件名:$($_.Name) | 文件大小(字节):$($_.Length)" } | Add-Content -Path C:\log.txt -Encoding utf8
导出效果示例:
文件名:fileexample.txt | 文件大小(字节):3482342 文件名:test.txt | 文件大小(字节):1234
注意:写入文件时建议显式指定
-Encoding utf8参数,避免不同PowerShell版本默认编码不一致导致的乱码问题。
内容的提问来源于stack exchange,提问作者Mike_Steve
相关产品推荐
相关产品推荐

