Ответ Матиаса Р. Джессена напрямую решает вашу проблему, создавая свойство script (тип ScriptProperty
), которое динамически вычисляет его значение из вмещающегосвойство .TimeStamp
объекта.
- Преимущество этого подхода состоит в том, что даже более поздние изменения в
.TimeStamp
будут правильно отражаться в .Time2
, хотя за счет необходимости вычислять значение для каждогоaccess.
Ответ Мануэля Батшинга предлагает альтернативу на основе Select-Object
, которая создает статические свойства заметки (тип NoteProperty
), так как выПервоначально пытались самостоятельно.
- Преимущество этого подхода заключается в том, что вы несете стоимость расчета только один раз, но более поздние изменения в
.TimeStamp
не будут отражены в .Time2
.
Чтобы предложить более быстрые альтернативы PSv5 + (каждый вызов по одному методу, разбитый по нескольким строкам для удобства чтения):
# ScriptProperty - dynamic
$TestArray.ForEach({
$_.psobject.properties.Add(
[psscriptproperty]::new('Time2', { [math]::Round($this.TimeStamp) })
)
})
# NoteProperty - static
$TestArray.ForEach({
$_.psobject.properties.Add(
[psnoteproperty]::new('Time2', [math]::Round($_.TimeStamp))
)
})
В вышеприведенных решениях используетсяPSv4 + .ForEach()
коллекцияon метод и метод типа PSv5 + static ::new()
для вызова конструкторов.
Наконец, re one-liner :
Следующий foreach
-loopрешение на основе свойства примечания также решило бы вашу проблему и было бы быстрее ;в то время как он разбит на несколько строк для удобства чтения, он также работает как однострочный:
foreach ($el in $TestArray) {
Add-Member -InputObject $el -Name Time2 -MemberType NoteProperty `
-Value ([math]::Round($el.TimeStamp))
}
Как правило, в то время как конвейер часто обеспечивает более элегантное решение с одной командой, которое, к сожалению, достигаетсяза счет производительности.