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

如何获取数组中Hashtable的索引?PowerShell代码场景咨询

修复PowerShell中JSON生成的Hashtable结构问题

看起来你在构建图书库的JSON结构时,Hashtable的嵌套写法出了问题,这会导致后续没法正确查找数组里的Hashtable索引。咱们一步步来解决:

原代码的核心问题

你当前构建$Data的方式里,@{$BIB = @{BIBName=$BIBName}, @{Standort = $Standort}, @{Bücher = @(...)} 用逗号分隔的部分会被解析成数组元素,而不是把BIBName、Standort、Bücher作为同一个Hashtable的键值对。这就导致你的结构完全不符合预期,自然没法正常查找索引。

修正后的代码

咱们把结构改成嵌套正确的Hashtable,这样生成的JSON结构才合理,后续查找索引也能正常进行:

$start = {
    Clear-Host
    $BIB = Read-Host 'Bibliothek'
    $BIBName = Read-Host 'Bibliothek Name'
    $Standort = Read-Host 'Bibliothek Standort'
    $Autor = Read-Host 'Buchautor'
    $BuchName = Read-Host 'Buchname'
    $jsonfile = "C:\Skripte\bibV2-1000.json" # 注意:你原代码写的是.xml,改成.json更符合格式

    if(![System.IO.File]::Exists($jsonfile)){
        # 初始化正确的嵌套结构:BIBs是数组,每个元素是包含BIB键的Hashtable,BIB的值是整合所有属性的Hashtable
        $Data = @{
            BIBs = @(
                @{
                    $BIB = @{
                        BIBName = $BIBName
                        Standort = $Standort
                        Bücher = @(
                            @{
                                BuchName = $BuchName
                                Autor = $Autor
                            }
                        )
                    }
                }
            )
        }
        # 转换为JSON并写入文件,指定足够深度避免截断
        $Data | ConvertTo-Json -Depth 10 | Out-File $jsonfile -Encoding UTF8
    }
    else {
        # 如果文件已存在,读取现有数据并追加新条目
        $existingData = Get-Content $jsonfile -Raw | ConvertFrom-Json -AsHashtable
        # 构建新的BIB条目
        $newBibEntry = @{
            $BIB = @{
                BIBName = $BIBName
                Standort = $Standort
                Bücher = @(
                    @{
                        BuchName = $BuchName
                        Autor = $Autor
                    }
                )
            }
        }
        # 追加到BIBs数组
        $existingData.BIBs += $newBibEntry
        # 写回文件
        $existingData | ConvertTo-Json -Depth 10 | Out-File $jsonfile -Encoding UTF8
    }
}
& $start

如何正确查找Hashtable索引

假设你现在要查找某个特定BIB对应的条目,可以这样做:

# 读取现有JSON数据并转为可操作的Hashtable
$jsonData = Get-Content "C:\Skripte\bibV2-1000.json" -Raw | ConvertFrom-Json -AsHashtable

# 目标BIB的标识(比如你输入的"BIB001")
$targetBibId = "BIB001"
# 查找该BIB在数组中的索引
$bibIndex = $jsonData.BIBs.FindIndex({ $_.Keys -contains $targetBibId })

if ($bibIndex -ne -1) {
    Write-Host "找到目标BIB,索引位置:$bibIndex"
    # 获取对应的完整条目
    $targetEntry = $jsonData.BIBs[$bibIndex][$targetBibId]
    Write-Host "BIB名称:$($targetEntry.BIBName),位置:$($targetEntry.Standort)"
}
else {
    Write-Host "未找到指定的BIB条目"
}

关键细节提醒

  1. -Depth 10:PowerShell的ConvertTo-Json默认深度只有2,嵌套结构深的话必须指定足够的深度,否则会被截断成{}。
  2. -AsHashtable:在ConvertFrom-Json时加这个参数,会把JSON转换成可修改的Hashtable,而不是只读的PSCustomObject,方便后续追加或修改数据。
  3. 文件名后缀修正:原代码写的是.xml,改成.json更符合生成的文件格式,避免混淆。

内容的提问来源于stack exchange,提问作者EDybck

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:04:07