PowerShell 中将管道对象转为 JSON 的核心是 ConvertTo-Json cmdlet,它可序列化 .NET 对象为标准 JSON 字符串,支持 -Depth、-Compress、-AsArray 等参数控制输出,并可用于文件保存或 API 调用。
powershell 中将管道对象转为 json,核心是用 convertto-json cmdlet。它把任意 .net 对象(比如服务、进程、自定义哈希表)序列化成标准 json 字符串,保留结构、字段名和值,自动忽略方法和不可序列化成员。
基础用法:直接管道输入
大多数场景下,只需把对象通过管道传给 ConvertTo-Json:
-
Get-Service | Select-Object Name, Status, StartType | ConvertTo-Json—— 输出服务基本信息的 JSON 数组 -
@{Name="Alice"; Age=30; City="Beijing"} | ConvertTo-Json—— 输出单个对象的 JSON 对象 -
Get-Date | ConvertTo-Json—— 默认输出 ISO 8601 时间字符串(如"2026-10-09T09:07:15.1234567+08:00")
关键参数控制输出行为
默认设置可能不满足复杂需求,常用参数有:
在 Windows 11 上"直接发声"的 TTS(从 WSL2/TUI 调用 powershell.exe + System.Speech)。适用于用户说"说出来/读出来/语音播报/用TTS",或反馈"没声音/tts 生成的 mp3 是空的/播不出来",以及需要中文语音但 OpenClaw 内置 tts 不可用时。
-
-Depth:默认只展开 2 层嵌套。若对象含多层属性(如嵌套哈希表或自定义对象),需显式指定更高值,例如
-Depth 10防止截断 - -Compress:去掉空格和换行,生成紧凑 JSON(适合日志或 API 请求体)
-
-AsArray:强制将单个对象包装成长度为 1 的数组(如
[{...}]),方便前端统一处理 -
-EnumsAsStrings:把枚举值转为字符串名(如
"Running"而非数字4),提升可读性
保存到文件或后续处理
JSON 字符串仍在管道中,可继续操作:
- 写入文件:
Get-Process | Select-Object Name,Id,CPU | ConvertTo-Json -Depth 5 | Set-Content processes.json - 传给 Web API:
$body = @{user="admin";action="update"} | ConvertTo-Json; Invoke-RestMethod -Uri https://api.example.com -Method Post -Body $body -ContentType "application/json" - 压缩后用于日志:
Get-UICulture | ConvertTo-Json -Compress
注意常见陷阱
避免转换失败或数据丢失:
- 含循环引用的对象会报错,需提前清理或使用
Select-Object提取所需属性 - PowerShell 7.2+ 不再序列化
DateTime和String的扩展类型属性(如.psobject.TypeNames),这是正常行为 - 若原始对象含重复键名(极少见),
ConvertFrom-Json反向解析时只保留最后一个值 - 从文件读取 JSON 再转回对象,必须用
Get-Content -Raw,否则分行读取会导致解析失败

















