看起来我希望这种工作的方式不会。我想要返回多个对象,但它似乎只返回一个。我不知道如何做到这一点。
一个非常简单的JSON文件:
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"storageAccountName": {
"value": "sa01"
},
"virtualNetworkName": {
"value": "nvn01"
}
}
}
我想动态地将参数及其值添加到一个漂亮的pscustomobject中(对于上面的数据看起来如下):
ParameterName | Value
===========================
storageAccountName | sa01
virtualNetworkName | nvn01
我不明白为什么以下内容会返回一个对象:
$TemplateParametersFile = "C:\Temp\deploy-Project-Platform.parameters.json"
$content = Get-Content $TemplateParametersFile -Raw
$JsonParameters = ConvertFrom-Json -InputObject $content
$JsonParameters.parameters | Measure-Object
在写这篇文章的同时,我最终找到了一个能够得到我想要的解决方案,我将在答案部分发布。随意上学,改进......
答案 0 :(得分:6)
我会做一些不同的事情,跳过哈希表,并使用隐藏的PSObject
属性。因此,在$content
中存储JSON数据后,我会做这样的事情:
#Convert JSON file to an object
$JsonParameters = ConvertFrom-Json -InputObject $content
#Create new PSObject with no properties
$oData = New-Object PSObject
#Loop through properties of the $JsonParameters.parameters object, and add them to the new blank object
$JsonParameters.parameters.psobject.Properties.Name |
ForEach{
Add-Member -InputObject $oData -NotePropertyName $_ -NotePropertyValue $JsonParameters.parameters.$_.Value
}
$oData
顺便说一句,它在转换您发布的JSON时出现问题,我不得不在这两个值周围添加引号,例如"value": "sa01"
。
答案 1 :(得分:1)
使用如上所示的相同JSON文件:
<#
# Read in JSON from file on disk
$TemplateParametersFile = "C:\Temp\deploy-Project-Platform.parameters.json"
$content = Get-Content $TemplateParametersFile -Raw
#>
#Retrieve JSON file from Azure storage account.
$TemplateParametersFile = "https://{storageAccountName}.blob.core.windows.net/{SomeContainer}/deploy-Project-Platform.parameters.json"
$oWc = New-Object System.Net.WebClient
$webpage = $oWc.DownloadData($TemplateParametersFile)
$content = [System.Text.Encoding]::ASCII.GetString($webpage)
#Convert JSON file to an object (IMHO- Sort of!)
$JsonParameters = ConvertFrom-Json -InputObject $content
#Build hashtable - easier to add new items - the whole purpose of this script
$oDataHash = @{}
$JsonParameters.parameters | Get-Member -MemberType NoteProperty | ForEach-Object{
$oDataHash += @{
$_.name = $JsonParameters.parameters."$($_.name)" | Select -ExpandProperty Value
}
}
#Example: adding a single item to the hashtable
$oDataHash.Add("VirtualMachineName","aDemoAdd")
#Convert hashtable to pscustomobject
$oData = New-Object -TypeName PSCustomObject
$oData | Add-Member -MemberType ScriptMethod -Name AddNote -Value {
Add-Member -InputObject $this -MemberType NoteProperty -Name $args[0] -Value $args[1]
}
$oDataHash.Keys | Sort-Object | ForEach-Object{
$oData.AddNote($_,$oDataHash.$_)
}
$oData
结果:
storageAccountName VirtualMachineName virtualNetworkName
------------------ ------------------ ------------------
sa01 aDemoAdd nvn01
同意,问题是要求参数/值对,这导致参数的名称被指定为noteproperty,但我认为以这种方式使用它会更容易。当然,$ oDataHash将其作为键/值对返回。
此脚本还直接从Azure存储帐户提取JSON文件。无需保存到磁盘。如果要保存到磁盘,请将$ oWc.DownloadData()更改为$ oWc。DownloadFile()。顶部的注释位从磁盘读取。
我确信有更简洁的方法可以达到相同的效果,我很乐意在这里。对我来说,目前这是有效的。