如何使用PowerShell无需硬编码索引访问JSON文件中的数组对象管控SQL服务
解决方案
你要的无硬编码索引访问效果可以通过将解析后的JSON数组转哈希表实现,完全符合你期望的$content.Server_Name["ServerABC"].Services调用方式,同时能自动适配任意数量的服务配置。
核心思路
- 将
ConvertFrom-Json输出的对象数组直接转换为以serverName为键的哈希表,直接通过服务器名称索引对应配置,无需手动查找索引 - 匹配到当前服务器配置后,对
services数组按order字段排序,自动按指定顺序处理服务,不管服务数量多少都能自动适配
完整可用脚本
# 定义配置文件路径 $InputFile = 'C:\temp\StartServices.json' # 校验配置文件是否存在 if (-not (Test-Path -Path $InputFile -PathType Leaf)) { Write-Host "JSON配置文件不存在,请检查路径" exit 1 } # 读取并解析JSON配置,转为以服务器名称为键的哈希表 $ParsedRaw = Get-Content -Raw -Path $InputFile | ConvertFrom-Json $serverConfigMap = @{} foreach ($configItem in $ParsedRaw) { $serverConfigMap[$configItem.serverName] = $configItem } $currentServerName = $env:COMPUTERNAME # 检查当前服务器是否在配置列表中 if (-not $serverConfigMap.ContainsKey($currentServerName)) { Write-Host "当前服务器无配置任务,无需执行操作" exit 0 } # 取出当前服务器的完整配置 $currentServerConfig = $serverConfigMap[$currentServerName] # 校验执行时间是否符合要求 $DateTimeNow = Get-Date $DateTimeEvent = [DateTime]::ParseExact($currentServerConfig.startAt, 'yyyy-MM-dd HH:mm:ss', $null) if ($DateTimeEvent -le $DateTimeNow) { Write-Host "配置的执行时间已过,无需执行操作" exit 0 } # 按指定顺序排序服务,逐个执行操作,无需硬编码任何索引 foreach ($service in $currentServerConfig.services | Sort-Object -Property order) { Set-Service -Name $service.serviceName -StartType $service.startupMode Start-Service -Name $service.serviceName Write-Host "服务 $($service.serviceName) 启动完成,启动类型已设置为 $($service.startupMode)" }
关键修改说明
- 哈希表转换后可以直接通过
$serverConfigMap["Main_SQL_Server"].services的方式访问任意服务器的服务配置,完全不需要手动计算索引 - 服务排序逻辑在遍历前自动按
order字段排序,不管配置的服务是3个还是5个以上都能按指定顺序执行 - 修正了原代码中字段名不匹配的问题(JSON中是
startupMode,原脚本误写为startMode) - 修正了原代码中日期格式化字符串少了一位
y的问题,避免时间解析报错
内容的提问来源于stack exchange,提问作者TheRealCode
相关产品推荐
相关产品推荐

