Вы можете сделать следующее, если хотите обновить $paramtemplate.parameters
значения свойств значениями из $newparam.parameters
properties.
$newparam.parameters.PSObject.Properties.Name | Foreach-Object {
$paramtemplate.parameters.$_ = $newparam.parameters.$_
}
Поскольку вы имеете дело с типом PSCustomObject
в .parameters
, .PSObject.Properties
вернет все свои свойства. Свойство .Name
возвращает строковое имя свойств. $_
- текущий объект, обрабатываемый в блоке сценария Foreach-Object { }
.
Вы можете сделать это немного по-другому, что уродливее (IMO), но может быть пренебрежимо более производительным.
$newparam.parameters.PSObject.Properties | Foreach-Object {
$paramtemplate.parameters.$($_.Name) = $_.Value
}
Примечание: Если $newparam
содержит свойства, которых $paramtemplate
не имеет, то нам придется добавить дополнительные логики c для обработки этого случая.
$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})
}
}