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