系统学习 Windows 学习路径:从 CMD 到 PowerShell、系统网络,再到 WSL 与 Server

Set-Content

覆盖写入文本文件,按指定编码保存,适合生成配置、清单和 JSON 文件。

补充说明

Set-Content 把 -Value 或管道输入写成文本,默认覆盖整个文件,不产生输出对象;支持 -WhatIf/-Confirm。管道:-Value 按值接收对象,-Path 可按属性名接收路径;写入前对象会被转成字符串,复杂对象请先用 ConvertTo-Json 或 Export-Csv。别名 sc 在 PowerShell 中指向它,容易与 sc.exe 服务控制命令混淆。

权限:需要对目标文件有写权限,对目录有创建权限;只读文件要加 -Force,但 -Force 不绕过 ACL,也不创建缺失的父目录。它只做文本写入,不做原子替换,写到一半失败可能留下截断文件;重要文件先写临时文件再 Move-Item 替换。

版本与编码:5.1 默认 ANSI,-Encoding UTF8 会写 BOM;7.x 默认 UTF-8 无 BOM,并支持 utf8BOM。重定向 > 在 5.1 生成 UTF-16LE,7.x 生成 UTF-8 无 BOM,和 Set-Content 的默认值并不相同。

常用示例

# 1. 写一行 hosts 记录,显式指定 UTF-8 避免跨版本差异
PS C:\> Set-Content -Path C:\Temp\hosts.txt -Value '127.0.0.1 localhost' -Encoding UTF8

# 2. 把对象序列化成 JSON 再落盘,保证结构而不是 ToString()
PS C:\> Get-Process | Select-Object -First 5 Name, Id | ConvertTo-Json | Set-Content C:\Temp\procs.json -Encoding UTF8

# 3. 写版本号且不追加换行,供脚本精确比较
PS C:\> Set-Content C:\Temp\version.txt -Value '3.0.2' -NoNewline

# 4. 先预览覆盖结果,确认路径和内容再执行
PS C:\> Set-Content C:\Temp\cfg.ini -Value @('[core]', 'Port=8080') -WhatIf

# 5. 覆盖只读文件需要 -Force;仍然受 ACL 限制
PS C:\> Set-Content C:\Temp\readonly.txt -Value 'updated' -Force

# 6. 写入后检查前几个字节,确认没有意外的 BOM
PS C:\> Format-Hex C:\Temp\procs.json | Select-Object -First 2

易错点与排错

相关命令

参考链接

读完自测

合上页面,先回答,再展开对照。

  1. Set-Content 和 Add-Content 的写入语义有什么不同?
  2. 为什么同一段 Set-Content -Encoding UTF8 在 5.1 和 7.x 生成的文件字节不同?
  3. 在 PowerShell 里执行 sc stop Spooler 可能发生什么?正确写法是什么?
答案
  1. Set-Content 覆盖整个文件,Add-Content 在末尾追加;前者会丢失原内容。
  2. 5.1 的 UTF8 带 BOM,7.x 的 UTF8 是无 BOM;需要固定字节时显式选 utf8BOM 或 utf8NoBOM(7.x)。
  3. sc 是 Set-Content 的别名,可能创建名为 stop 的文件而不是控制服务;应写 sc.exe stop Spooler。
微信小程序码:扫码打开命令速查小程序

小程序版

微信扫码,随时查命令