如何获取数组中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条目" }
关键细节提醒
-Depth 10:PowerShell的ConvertTo-Json默认深度只有2,嵌套结构深的话必须指定足够的深度,否则会被截断成{}。-AsHashtable:在ConvertFrom-Json时加这个参数,会把JSON转换成可修改的Hashtable,而不是只读的PSCustomObject,方便后续追加或修改数据。- 文件名后缀修正:原代码写的是
.xml,改成.json更符合生成的文件格式,避免混淆。
内容的提问来源于stack exchange,提问作者EDybck
相关产品推荐
相关产品推荐

