引用运算符后缺少 属性 名称

Missing property name after reference operator

我有一张地图,原来是c++代码,读取文件,解析成地图。原始代码是一个枚举,并没有所有项目的值。 $文件内容:

enum{
    Error_A = 110,    
    Error_B,               
    Error_C,               
    Error_D,             
    Error_E,             
    Error_F,          
    Error_G = 118,  
...
};    

我已经阅读了文件内容并将其放入这样的地图中(工作正常):

  function Get-Contents_b{
    [cmdletbinding()]
    Param ([string]$fileContent)

            #Error_AA = 20
  
    # create an ordered hashtable to store the results
    $errorMap = [ordered]@{}
    # process the lines one-by-one
    switch -Regex ($fileContent -split '\r?\n') {
      '^[\s]*([\w]+)[\s=]*([-\d]*)' { # Error...=12345
        $key,$value = ($matches[1,2])|ForEach-Object Trim
        $errorMap[$key] = $value
    }
  }
...

然后我想遍历地图,对于枚举值依赖于前一个数字增加的那些,我想分配前一个值加一的值。我正在尝试在下面执行此操作,但是使用 $key-1 获取 $previousKey,然后从中获取值,给出了注释中显示的错误。

  foreach ($key in $errorMap.$keys)
  {
      $previousKey = $errorMap.[($key-1)]  #missing property name after the reference operator
      Write-Host $errorMap.$previousKey
      if(($errorMap.$key).Value = "")
      {
        $errorMap.$key.Value = $errorMap.$previousKey.Value + 1
      }
  }

任何想法如何解决这个问题或获取先前的值并将先前的值加一分配给下一个空值?

这是 powershell 5.1 和 VSCode。

您错误地将通过 . 运算符的成员 (属性) 访问与通过 [...] 的索引访问混合在一起 - 您必须使用一个 另一个.

但是,您想要的是 位置 访问您的密钥(这仅适用于 有序 哈希表):

foreach ($keyIndex in 0..($errorMap.Count-1))
{
  if ('' -eq $errorMap[$keyIndex]) {
    $previousValue = $errorMap[$keyIndex - 1] 
    Write-Host $previousValue
    $errorMap[$keyIndex] = 1 + $previousValue
  }
}

为什么不立即在哈希表中创建值,而不是事后填充空值?

function Get-Contents_b{
    [cmdletbinding()]
    Param ([string]$fileContent)
    # create an ordered hashtable to store the results
    $errorMap     = [ordered]@{}
    $currentValue = 0
    # process the lines one-by-one
    switch -Regex ($fileContent -split '\r?\n') {
        '^\s+(\w+)\s*[,=]'{
            $key, $value = ($_ -split '[,=]', 2).Trim()
            if ([string]::IsNullOrWhiteSpace($value)) { $value = $currentValue }
            $errorMap[$key] = [int]$value
            $currentValue   = [int]$value + 1
        }
    }
    # return the map
    $errorMap
}

Get-Contents_b $enum

输出:

Name                           Value
----                           -----
Error_A                        110
Error_B                        111
Error_C                        112
Error_D                        113
Error_E                        114
Error_F                        115
Error_G                        118