从调用值中提取变量 - 在条件中获取错误消息
Extracting variables from calling the value- Getting Error message in condition
我正在尝试进行验证。使用给定值检查已部署的值。我使用 RestAPI 方法从 Azure 资源中提取 vnet 值,并从 Object 中提取 vnet 值,因为 vnet 对象给我空对象 (@{value=System.Object[]})。以下是我得到的 Json 代码:
{
"value": [
{
"properties": "@{virtualNetworkSubnetId=/subscriptions/<XXXX>/resourceGroups/<XXXX>/providers/Microsoft.Network/virtualNetworks/<XXXX>/subnets/<XXXX>; ignoreMissingVnetServiceEndpoint=True; state=Ready}",
"id": "/subscriptions/<XXXX>/resourceGroups/<XXXX>/providers/Microsoft.DBforPostgreSQL/servers/<XXXX>/virtualNetworkRules/<XXXX>",
"name": "<XXXX>",
"type": "Microsoft.DBforPostgreSQL/servers/virtualNetworkRules"
}
]
}
下面的powershell命令是比较值但是得到一个错误说$vnet.name and $vnet.id is $null
$vnet= ( $vnet | ConvertTo-Json)
It "has this number of vNet Rules defined: $($config.vnetRules.count)"
{
$vnet.count | Should -Be $config.vnetRules.count
}
#$vnet.count is working and giving an success message
foreach ($vnetRule in $config.vNetRules) {
Write-Host $vnet #-> getting Json
Write-Host $vnet.Name #-> return as Empty($null)
Write-Host $vnet.value.Name #-> return as Empty($null)
Write-Host $vnet.id #-> return as Empty($null)
Write-Host $vnet.value.id #-> return as Empty($null)
it "has a vNet rule named: $($vnetRule.ruleName)" {
$vnet.name | Should -Be $vnetRule.ruleName
}
it "has a vNet Rule Subnet ID of: $($vNetRule.subnetId)" {
$vnet.value.id | Should -Be $vNetRule.subnetId
}
}
Returns $null.
在我尝试重新创建您的 invoke-restmethod
输出时,我使用您的 JSON 数据包作为输入来创建 $vnet
变量。
我认为问题出在您使用 Write-host
来显示对象而不是简单地显示对象名称。 Write-host
将尝试将复杂对象转换为字符串,因此您会看到奇怪的输出,如下所示。当我简单地取出对象时看到区别了吗?
现在,$vnet
有 4 个属性 id, name, properties, type
并且可以如图所示调用。
在您的例子中,您已将变量 $vnet
转换为 json
,然后尝试显示其属性。但是 Json
没有任何属性,除了 length
。因此,调用这些属性将为您提供 null。
我正在尝试进行验证。使用给定值检查已部署的值。我使用 RestAPI 方法从 Azure 资源中提取 vnet 值,并从 Object 中提取 vnet 值,因为 vnet 对象给我空对象 (@{value=System.Object[]})。以下是我得到的 Json 代码:
{
"value": [
{
"properties": "@{virtualNetworkSubnetId=/subscriptions/<XXXX>/resourceGroups/<XXXX>/providers/Microsoft.Network/virtualNetworks/<XXXX>/subnets/<XXXX>; ignoreMissingVnetServiceEndpoint=True; state=Ready}",
"id": "/subscriptions/<XXXX>/resourceGroups/<XXXX>/providers/Microsoft.DBforPostgreSQL/servers/<XXXX>/virtualNetworkRules/<XXXX>",
"name": "<XXXX>",
"type": "Microsoft.DBforPostgreSQL/servers/virtualNetworkRules"
}
]
}
下面的powershell命令是比较值但是得到一个错误说$vnet.name and $vnet.id is $null
$vnet= ( $vnet | ConvertTo-Json)
It "has this number of vNet Rules defined: $($config.vnetRules.count)"
{
$vnet.count | Should -Be $config.vnetRules.count
}
#$vnet.count is working and giving an success message
foreach ($vnetRule in $config.vNetRules) {
Write-Host $vnet #-> getting Json
Write-Host $vnet.Name #-> return as Empty($null)
Write-Host $vnet.value.Name #-> return as Empty($null)
Write-Host $vnet.id #-> return as Empty($null)
Write-Host $vnet.value.id #-> return as Empty($null)
it "has a vNet rule named: $($vnetRule.ruleName)" {
$vnet.name | Should -Be $vnetRule.ruleName
}
it "has a vNet Rule Subnet ID of: $($vNetRule.subnetId)" {
$vnet.value.id | Should -Be $vNetRule.subnetId
}
}
Returns $null.
在我尝试重新创建您的 invoke-restmethod
输出时,我使用您的 JSON 数据包作为输入来创建 $vnet
变量。
我认为问题出在您使用 Write-host
来显示对象而不是简单地显示对象名称。 Write-host
将尝试将复杂对象转换为字符串,因此您会看到奇怪的输出,如下所示。当我简单地取出对象时看到区别了吗?
现在,$vnet
有 4 个属性 id, name, properties, type
并且可以如图所示调用。
在您的例子中,您已将变量 $vnet
转换为 json
,然后尝试显示其属性。但是 Json
没有任何属性,除了 length
。因此,调用这些属性将为您提供 null。