覆盖写入文本文件,按指定编码保存,适合生成配置、清单和 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
Set-Content 会清空原文件再写,不是追加;追加用 Add-Content。误覆盖后只能从备份、卷影副本或版本库恢复,写入前先用 -WhatIf 核对。-Encoding UTF8 带 BOM;7.x 默认无 BOM。下游程序(尤其 JSON/脚本解析器)对 BOM 敏感时,验证 Format-Hex 的前 3 个字节是否为 EF BB BF。sc 当服务控制命令使用,实际执行了 Set-Content,可能生成名为 stop 或 start 的文件;服务操作写 sc.exe stop Spooler。Set-Content 不会自动建目录;先 New-Item -ItemType Directory -Force。-Force;若仍失败,用 Get-Acl 检查写权限,而不是继续加参数。System.Object[] 之类的字符串;先 ConvertTo-Json -Depth、Export-Csv 或 Out-String。-Encoding UTF8 语义从“带 BOM”变为“无 BOM”;需要 BOM 时显式 -Encoding utf8BOM。Get-Content — 读回文件验证写入结果。ConvertTo-Json — 把对象转成可写入的 JSON 文本。PowerShell — 了解 5.1 与 7.x 的默认编码差异。合上页面,先回答,再展开对照。
Set-Content 和 Add-Content 的写入语义有什么不同?Set-Content -Encoding UTF8 在 5.1 和 7.x 生成的文件字节不同?sc stop Spooler 可能发生什么?正确写法是什么?Set-Content 覆盖整个文件,Add-Content 在末尾追加;前者会丢失原内容。utf8BOM 或 utf8NoBOM(7.x)。sc 是 Set-Content 的别名,可能创建名为 stop 的文件而不是控制服务;应写 sc.exe stop Spooler。
小程序版
微信扫码,随时查命令