引用运算符后缺少 属性 名称
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
我有一张地图,原来是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