我使用Powershell 5.1,我尝试使用(简单的)JSON文件作为脚本之间的信箱。因此,在脚本的开头,我读取文件,修改它并将其存储在结尾。例如,以下文件
{
"A": {
"April": "4",
"August": "8"
},
"J": {
"January": "1",
"July": "7"
}
}
字符串
为了更好的处理,我写了一个Read-Value和一个Write-Value函数。在这个例子中,Read-Value显示了我的问题:函数找不到参数“Name”。
$config_file_full = Join-Path -Path $PSScriptRoot -ChildPath 'months.json'
$config_json = Get-Content -Raw -Path $config_file_full | ConvertFrom-Json
function Read-Value {
param (
[string]$Subject,
[string]$Name
)
# $result = $null
if (-not ($config_json.PSObject.Properties.Name -contains $Subject)) {
Write-Host "READ NO MATCH for SUBJECT " $Subject
$result = $null
} elseif (-not ($config_json.PSObject.Properties.$Subject.Name -contains $Name)) {
Write-Host "READ NO MATCH FOR SUBJECT " $Subject "NAME " $Name
$result = $null
} else {
$result = $config_json.$Subject.$Name
Write-Host "READ NO MATCH FOR SUBJECT " $Subject "NAME " $Name "VALUE <" $result ">"
}
return $result
}
$a = Read-Value -Subject 'A' -Name 'April'
Write-Host "<" $a ">"
$config_json | ConvertTo-Json | Set-Content -Path $config_file_full
型
结果是
READ NO MATCH FOR SUBJECT A NAME April
< >
型
怎么了?其他条件不符合预期。谢谢
2条答案
按热度按时间disbfnqx1#
James Ruskin's answer将解决您的问题,但如果您将
if/elseif/else
语句替换为两个单独的if
块,然后使用return
在错误条件下“提前退出”,则可以更优雅地完成此操作:字符串
4si2a6ki2#
这里有几个问题。
PSPropertyInfo
示例的集合(感谢@mklement0进行了更正),它不允许您使用点表示法来处理每个属性。$Subject
时,Name
属性包含的是那个Subject的名字,而不是你要检查的$Name
。这应该更好地工作:
字符串