PowerShell 按自定义格式导出文件属性到文本文件的实现方法
问题根因
- 执行首个命令生成空白文件:
Write-Host的输出直接写入控制台宿主,不会进入PowerShell管道流,后续连接的Format-Table、Out-File无法获取到任何可处理的对象,最终只能生成空文件。 - 执行第二个命令格式错乱:在脚本块内用逗号分隔三个属性时,PowerShell会将三个属性识别为独立的输出对象依次送入管道,重定向时每个对象单独占一行,无法合并为单条记录。
目标格式实现方案
方案1:手动拼接单行字符串(推荐,格式完全可控)
直接将每个文件的三个属性拼接为单个字符串后送入管道,从根源上避免对象拆分、表头冗余的问题:
gci -r | % { "$($_.Name) $($_.FullName) $($_.LastWriteTime)" } | out-file output.txt -Encoding utf8
如果需要和示例里的短日期格式完全对齐,可以对LastWriteTime做格式化处理:
gci -r | % { # 按示例要求的格式输出时间,去掉冗余的星期、月份全称 $time = $_.LastWriteTime.ToString('M/d/yyyy h:mm:ss tt') "$($_.Name) $($_.FullName) $time" } | out-file output.txt -Encoding utf8
运行后输出的每一行就是单个文件的三项信息,没有默认的Mode、Length等无关列,也没有列名表头。
方案2:保留格式化能力、关闭冗余表头
如果需要自动对齐的排版效果,可以在格式化命令里直接指定需要的属性、隐藏表头,不需要额外拼接字符串:
gci -r | Select-Object Name, FullName, LastWriteTime | ft -Wrap -HideTableHeaders | out-file output.txt -Encoding utf8
注意:必须通过
Select-Object限定需要输出的属性范围,否则格式化命令会自动带上Mode、Length等无关列,和你要排除的默认表头内容重合。
常见使用提醒
- 不要在管道处理链路中使用
Write-Host生成待写入文件的内容,它仅适用于控制台即时日志输出,无法参与管道传递、文件写入流程。 - 写入文件时指定
-Encoding utf8参数,避免包含中文的文件名出现乱码。
内容的提问来源于stack exchange,提问作者Sadam
相关产品推荐
相关产品推荐

