You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用PowerShell无需硬编码索引访问JSON文件中的数组对象管控SQL服务

解决方案

你要的无硬编码索引访问效果可以通过将解析后的JSON数组转哈希表实现,完全符合你期望的$content.Server_Name["ServerABC"].Services调用方式,同时能自动适配任意数量的服务配置。

核心思路

  1. 将ConvertFrom-Json输出的对象数组直接转换为以serverName为键的哈希表,直接通过服务器名称索引对应配置,无需手动查找索引
  2. 匹配到当前服务器配置后,对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 11:54:03