К дополнению Полезный ответ LotPings , который предлагает эффективные решения:
Что касается , почему ваш код не работал :
В то время как Select-Object
параметр -Property
принимает хеш-таблицы , которые определяют вычисляемые свойства (например, в вашем коде), параметр -ExpandProperty
принимает только свойство имя , как строка .
Следовательно, ваша хеш-таблица просто stringified , что приводит к строковому литералу System.Collections.Hashtable
, в результате чего Select-Object
выдает жалобу, учитывая, что у этого имени нет свойства.
Цель -ExpandProperty
- вывести только свойство value , а не пользовательский объект с этим свойством .
Поэтому вам не нужен обходной путь через Select-Object
, и вы можете просто использовать блок скрипта вывода значения - { $_.Created.ToString("yyyy-MM-dd") }
- непосредственно с ForEach-Object
вместо этого, как показано в нижней части ответа LotPings.
Однако есть скрытая функция, от которой вы отказываетесь, используя ForEach-Object
: Select-Object
позволяет объединять -ExpandProperty
с -Property
, и в этом случае добавляются свойства, указанные с помощью -Property
как NoteProperty
членов значения свойства, указанного через -ExpandProperty
:
PS> $val = [pscustomobject] @{ one = 'uno'; two = 2 } |
Select-Object -ExpandProperty one -Property two; $val; $val.two
uno
2
Обратите внимание, как для выходного значения string , 'uno'
прикреплена копия свойства .two
входного объекта.
Чтобы эмулировать это с ForEach
, требуется больше работы:
PS> $val = [pscustomobject] @{ one = 'uno'; two = 2 } | ForEach-Object {
$_.one + '!' | Add-Member -PassThru two $_.two
}; $val; $val.two
uno!
2