将参数附加到现有PSCustomObject';op#U添加';powershell中的错误

将参数附加到现有PSCustomObject';op#U添加';powershell中的错误,powershell,Powershell,尝试从gihub解析Azure参数模板,并将某些参数更新到Powershell中的文件,然后将其提交回github以实现自动化。我似乎在将新参数添加回从github提取的文件时出错了。我已经检查并确保两个对象都是相同的 我将JSON文件从github fine中拉下来,将其从JSON转换,编译我的新参数对象,当我将新参数添加回原始参数时,我收到以下错误: Method invocation failed because [System.Management.Automation.PSObject

尝试从gihub解析Azure参数模板,并将某些参数更新到Powershell中的文件,然后将其提交回github以实现自动化。我似乎在将新参数添加回从github提取的文件时出错了。我已经检查并确保两个对象都是相同的

我将JSON文件从github fine中拉下来,将其从JSON转换,编译我的新参数对象,当我将新参数添加回原始参数时,我收到以下错误:

Method invocation failed because [System.Management.Automation.PSObject] does not contain a method named 'op_Addition'.
At line:1 char:1
+ $paramTemplate.parameters += $newparam
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (op_Addition:String) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound
Powerhell代码:

#Get Content
$paramContent = (Invoke-WebRequest -Uri $parameterUri -Headers $headers -UseBasicParsing).content 
$paramTemplate = $paramContent | ConvertFrom-Json

#define parameters in JSON Format
$addnewparam = @"
    {
    "parameters": {
        "virtualMachineRG": {
            "value": "$virtualMachineRG"
        },
        "virtualMachineName": {
            "value": "$virtualMachineName"
        },
        "virtualMachineSize" : {
            "value": "$virtualMachineSize"
        },
        "diagnosticsStorageAccountName": {
            "value": "$diagnosticsStorageAccountName"
        }
    }
    }
"@

$newparam = $addnewparam | ConvertFrom-JSON
$paramTemplate.parameters += $newparam
非常感谢您的任何见解


PS C:\GitHub\Azure> $paramtemplate.GetType()
>>

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     False    PSCustomObject                           System.Object


PS C:\GitHub\Azure> $newparam.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     False    PSCustomObject                           System.Object
我还尝试将NoteProperty与这两个属性进行相同的匹配,但都没有成功。我在PS5.1.17763.771上

PS C:\GitHub\Azure> $paramtemplate | get-member


   TypeName: System.Management.Automation.PSCustomObject

Name           MemberType   Definition
----           ----------   ----------
Equals         Method       bool Equals(System.Object obj)
GetHashCode    Method       int GetHashCode()
GetType        Method       type GetType()
ToString       Method       string ToString()
$schema        NoteProperty string $schema=https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#
contentVersion NoteProperty string contentVersion=1.0.0.0
parameters     NoteProperty System.Management.Automation.PSCustomObject parameters=@{subnetName=; virtualNetworkId=; virtualMachineName=; virtualMachineRG=; osDiskType=; virtualMachineSize=; admi...


PS C:\GitHub\Azure> $newparam | Get-Member


   TypeName: System.Management.Automation.PSCustomObject

Name        MemberType   Definition
----        ----------   ----------
Equals      Method       bool Equals(System.Object obj)
GetHashCode Method       int GetHashCode()
GetType     Method       type GetType()
ToString    Method       string ToString()
parameters  NoteProperty System.Management.Automation.PSCustomObject parameters=@{virtualMachineRG=; virtualMachineName=; virtualMachineSize=; diagnosticsStorageAccountName=}

如果要使用
$newparam.parameters
属性中的值更新
$paramtemplate.parameters
属性值,可以执行以下操作

$newparam.parameters.PSObject.Properties.Name | Foreach-Object { 
    $paramtemplate.parameters.$_ = $newparam.parameters.$_
}
由于您正在处理
PSCustomObject
键入
.parameters
.PSObject.Properties
将返回其所有属性。
.Name
属性返回属性的字符串名称
$\uu0
是在
Foreach对象{}
脚本块中处理的当前对象


你可以做的稍有不同,这是丑陋的(依我看),但可以忽略更多的性能

$newparam.parameters.PSObject.Properties | Foreach-Object { 
    $paramtemplate.parameters.$($_.Name) = $_.Value
}

注意:如果
$newparam
包含
$paramtemplate
没有的属性,则我们必须添加更多逻辑来处理该情况

$newparam.parameters.PSObject.Properties | Foreach-Object { 
    if ($paramtemplate.parameters.PSObject.Properties.Name -contains $_.Name) {
        $paramtemplate.parameters.$($_.Name) = $_.Value
    }
    else {
        $paramtemplate.parameters | Add-Member -Type NoteProperty -Name $_.Name -Value $_.Value
    }
}

关于您收到的错误消息,发生这种情况是因为您试图将一个
PSCustomObject
添加到另一个
PSCustomObject
。这种类型的操作要求第一个对象是集合。在添加下一个对象之前,可以使用一元运算符
将对象转换为集合。语法如下:

$object1 = ,$object1 + $object2
编辑

更仔细地观察这些对象,所有属性似乎都包含另一个
PSCustomObject
,该属性名为
Value
,具有您将提供的某些值。在这种情况下,以下内容将用于更新模板

$newparam.parameters.PSObject.Properties | Foreach-Object { 
    if ($paramtemplate.parameters.PSObject.Properties.Name -contains $_.Name) {
        $paramtemplate.parameters.$($_.Name).Value = $_.Value.Value
    }
    else {
        $paramtemplate.parameters | Add-Member -Type NoteProperty -Name $_.Name -Value ([pscustomobject]@{Value = $_.Value.Value})
    }
}

如果要使用
$newparam.parameters
属性中的值更新
$paramtemplate.parameters
属性值,可以执行以下操作

$newparam.parameters.PSObject.Properties.Name | Foreach-Object { 
    $paramtemplate.parameters.$_ = $newparam.parameters.$_
}
由于您正在处理
PSCustomObject
键入
.parameters
.PSObject.Properties
将返回其所有属性。
.Name
属性返回属性的字符串名称
$\uu0
是在
Foreach对象{}
脚本块中处理的当前对象


你可以做的稍有不同,这是丑陋的(依我看),但可以忽略更多的性能

$newparam.parameters.PSObject.Properties | Foreach-Object { 
    $paramtemplate.parameters.$($_.Name) = $_.Value
}

注意:如果
$newparam
包含
$paramtemplate
没有的属性,则我们必须添加更多逻辑来处理该情况

$newparam.parameters.PSObject.Properties | Foreach-Object { 
    if ($paramtemplate.parameters.PSObject.Properties.Name -contains $_.Name) {
        $paramtemplate.parameters.$($_.Name) = $_.Value
    }
    else {
        $paramtemplate.parameters | Add-Member -Type NoteProperty -Name $_.Name -Value $_.Value
    }
}

关于您收到的错误消息,发生这种情况是因为您试图将一个
PSCustomObject
添加到另一个
PSCustomObject
。这种类型的操作要求第一个对象是集合。在添加下一个对象之前,可以使用一元运算符
将对象转换为集合。语法如下:

$object1 = ,$object1 + $object2
编辑

更仔细地观察这些对象,所有属性似乎都包含另一个
PSCustomObject
,该属性名为
Value
,具有您将提供的某些值。在这种情况下,以下内容将用于更新模板

$newparam.parameters.PSObject.Properties | Foreach-Object { 
    if ($paramtemplate.parameters.PSObject.Properties.Name -contains $_.Name) {
        $paramtemplate.parameters.$($_.Name).Value = $_.Value.Value
    }
    else {
        $paramtemplate.parameters | Add-Member -Type NoteProperty -Name $_.Name -Value ([pscustomobject]@{Value = $_.Value.Value})
    }
}
试试这个:

$newparam | ForEach {
  $paramtemplate.parameters | Add-Member -MemberType NoteProperty -Name $_.Name -Value $_.Value
}
这将迭代psobject以逐个添加属性。

尝试以下操作:

$newparam | ForEach {
  $paramtemplate.parameters | Add-Member -MemberType NoteProperty -Name $_.Name -Value $_.Value
}

这将迭代psobject以逐个添加属性。

.parameters
不是一个集合,因此只有在它存在时才能添加到其中<代码>$paramtemplate.parameters=,$paramtemplate.parameters+$newparam应该可以工作。逗号一元运算符使它成为您第一次添加的集合。这似乎将它添加到了参数中,但希望向对象添加一个额外的参数部分。这将不会在以后工作,因为我将在文件中有一些重复的参数。我只想从原始的``PS C:\GitHub\Azure>$paramTemplate.parameters virtualMachineName:@{value=palmer tst}VirtualMachineErg:@{value=AZ-EA-RG-SBX.}virtualMachineSize:@{value=Standard\u B2ms}diagnosticsStorageAccountName:@{value=azeargsbxpalmerne2361}参数:@{virtualMachineRG=;virtualMachineName=;virtualMachineSize=;diagnosticsStorageAccountName=}“``啊,我原以为代码片段可以工作。但基本上我需要更新原始文件中的参数,而不是添加额外的部分。甚至更新它们
可能都不可行。parameters
不是一个集合,因此在它存在之前,您无法添加到其中。
$paramtemplate.parameters=,$paramtemplate.parameters+$newparam
应该可以工作。逗号一元运算符使它成为您第一次添加的集合。这似乎将它添加到了参数中,但希望向对象添加一个额外的参数部分。这在以后将不起作用,因为我在文件中会有一些重复的参数。我正在查找的参数只有一个或多个从原始``PS C:\GitHub\Azure>$paramTemplate.parameters虚拟机名称更新:@{value=palmer tst}虚拟机:@{value=AZ-EA-RG-SBX.}虚拟机名称:@{value=Standard_B2ms}诊断存储帐户名称:@{value=AzergsbXPalmerne2361}参数:@{VirtualMachine=;虚拟机