两个写文件命令
Set-Content 与 Out-File 都把内容写进文件,但机制不同:Set-Content 按值写入,把对象转成字符串原样落盘;Out-File 按终端显示的格式写入,会受表格渲染与列宽影响。两者在 Windows PowerShell 5.1 与 PowerShell 7 上的默认编码也不一样,跨系统读写时必须显式指定。
基本信息
| 适用平台 | Windows PowerShell 5.1 与 PowerShell 7 |
|---|---|
| 语法 | Set-Content -Path 文件 -Value 内容 [-Encoding UTF8];<对象> | Out-File 文件 [-Width 300] [-Append] |
| 默认编码 | 5.1 的 UTF8 会带 BOM;Out-File 默认 UTF-16LE;7.x 默认无 BOM 的 UTF8 |
| 追加写入 | Add-Content 或 Out-File -Append |
| 无 BOM 写法 | [IO.File]::WriteAllText,或 7.x 的 utf8NoBOM |
典型使用场景
- 写状态标记文件,让后续脚本判断上一步流程是否完成
- 把命令输出保存成日志或报告留档
- 生成配置文件清单,交给其他工具读取
- 追加写入运行日志,避免覆盖历史记录
- 输出给 Excel 或 Windows 工具查看时使用带 BOM 的编码
常用示例
常用示例
'ok' | Set-Content D:\Logs\status.txt -Encoding UTF8
# 追加写入,不覆盖已有内容
Add-Content D:\Logs\status.txt -Value ('完成 ' + (Get-Date)) -Encoding UTF8
# 对象输出到文件,加宽避免截断
Get-Process | Out-File D:\Logs\proc.txt -Encoding UTF8 -Width 300
# 只要无 BOM 的 UTF-8,5.1 需要借 .NET 方法
[IO.File]::WriteAllText('D:\Logs\plain.txt', 'ok', (New-Object Text.UTF8Encoding $false))
# PowerShell 7 可直接指定无 BOM
Set-Content D:\Logs\plain7.txt -Value 'ok' -Encoding utf8NoBOM写法对照
| 写法 | 机制 | 适用场景 |
|---|---|---|
| Set-Content | 按值写入,不做格式化 | 写简单文本与单个值 |
| Out-File | 按终端显示格式写入 | 保存命令输出与报告 |
| Add-Content | 追加到文件末尾 | 日志累积 |
| Export-Csv | 按列写结构化数据 | 表格数据交换 |
| [IO.File]::WriteAllText | 精确控制编码与字节 | 必须无 BOM 的场合 |
5.1 中 -Encoding UTF8 会写入 BOM,部分程序(尤其是 Linux 侧脚本与解析器)会把 BOM 当成内容的第一部分。需要无 BOM 时用 .NET 方法写,或升级到 PowerShell 7 使用 utf8NoBOM。
Out-File 默认按控制台宽度截断长行,导出对象时若不加 -Width,日志里会出现省略号,事后排查就看不到完整信息了。
遇到别人打开文件乱码时,先确认写入方是 5.1 还是 7、用的哪个编码名,再决定读取方怎么解码;只改读取端经常治不好,不如在写入端一次性把编码定死并写进脚本注释。