PowerShell通过Import-Csv和ConvertFrom-Json实现CSV与JSON的解析、筛选、转换及自动化决策,支撑数据驱动运维。支持编码指定、嵌套访问、格式互转及条件触发操作。
powershell 解析 csv 和 json 是数据驱动运维(ddo)落地的关键一环——它让配置、状态、日志等结构化数据能被脚本直接读取、筛选、比对和推送,无需人工干预。
用 Import-Csv 管理批量配置与清单
运维中大量使用 CSV 存储服务器列表、服务映射、权限规则等静态清单。Import-Csv 将其转为对象数组,便于管道处理:
- 直接导入:`$servers = Import-Csv .\servers.csv -Encoding UTF8`(推荐显式指定编码,避免中文乱码)
- 按条件筛选:`$prodServers = $servers | Where-Object { $_.Env -eq 'prod' -and $_.Status -eq 'online' }`
- 组合命令快速验证:`Import-Csv .\users.csv | Where-Object Enabled -eq 'True' | Select-Object Name,Email | Export-Csv active_users.csv -NoTypeInformation`
用 ConvertFrom-Json 处理 API 响应与配置文件
现代运维工具(如 Azure CLI、kubectl、Ansible Tower API)返回 JSON;本地配置(如 config.json、policy.json)也多为 JSON 格式。ConvertFrom-Json 让它们变成可点选的对象:
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
- 解析本地文件:`$cfg = Get-Content .\appconfig.json -Raw | ConvertFrom-Json`(-Raw 防止换行截断,必须加)
- 提取嵌套值:`$cfg.database.host`、`$cfg.features.enabled[0]` 直接访问层级属性或数组元素
- 配合网络请求:`$apiData = Invoke-RestMethod https://api.example.com/v1/health | ConvertFrom-Json`(Invoke-RestMethod 本身已自动解析 JSON,此处可省略 ConvertFrom-Json,但显式调用更统一)
CSV 与 JSON 互相转换,打通数据链路
不同系统间常需格式互换。例如将监控导出的 JSON 日志转成 CSV 供 Excel 分析,或将 CMDB 的 CSV 导入生成 API 批量请求体:
- JSON → CSV(适用于数组型 JSON):
Get-Content data.json | ConvertFrom-Json | Select-Object name,ip,role | Export-Csv out.csv -NoTypeInformation -Encoding UTF8 - CSV → JSON(用于构造请求体):
Import-Csv input.csv | ForEach-Object { [PSCustomObject]@{ hostname=$_.Name; ip=$_.IP; tags=@($_.Role) } } | ConvertTo-Json -Depth 5 > payload.json(-Depth 5 防止嵌套被截断)
结合条件逻辑做自动化决策
真正实现“驱动”,在于把解析结果接入判断与动作。例如根据 JSON 中的 status 字段触发重启,或对比 CSV 新旧清单执行增删:
- 基于 JSON 状态执行操作:
if (($health = (Invoke-RestMethod api/status) | ConvertFrom-Json).status -ne 'healthy') { Restart-Service MyApp } - 比对 CSV 清单更新资源:
$current = Import-Csv current.csv; $desired = Import-Csv desired.csv; Compare-Object $current $desired -Property Name,IP | Where-Object SideIndicator -eq '=>' | ForEach-Object { Add-Server $_.Name $_.IP }


















