Чтобы дополнить полезный ответ zdan[1] альтернативами:
Если вам просто нужно значение свойства данного объекта, просто оберните команду в (...)
и используйте .<propertyName>
:
(Get-ItemProperty 'C:\Program Files\McAfee').LastWriteTime # returns a [datetime] instance
В PSv3+ описанное выше также работает с командами, возвращающими несколько элементов (массивов), и в этом случае выводится массив значений отдельных свойств входных элементов — эта функция называется перечисление элементов.
В PSv3 появился сокращенный синтаксис для %
/ ForEach-Object
(а также ?
/ Where-Object
), который можно использовать и здесь:
Get-ItemProperty 'C:\Program Files\McAfee' | % LastWriteTime # ditto
Это эквивалент более подробного (который также работает в PSv2-):
Get-ItemProperty 'C:\Program Files\McAfee' | % { $_.LastWriteTime }
Эти две формы синтаксиса на основе конвейера медленнее, но имеют два преимущества:
Большие входные коллекции лучше обрабатывать в конвейерах один за другим, чтобы поддерживать постоянное использование памяти (если это возможно; если вам нужно собрать весь вывод в памяти, нет никакого преимущества).
Этот синтаксис однозначно ссылается на свойство отдельного элемента, а не на свойство коллекции в целом.
- E.g.,
(Get-ChildItem -File C:\Windows).Length
returns the count of files in C:\Windows
, because Length
is interpreted as the collection's (array's) property;
by contrast, Get-ChildItem -File C:\Windows | % Length
returns an array of the individual files' .Length
(file-size) property values.
Наконец, в PSv4+ вы также можете использовать .ForEach()
метод коллекции, который не использует конвейер и, следовательно, работает быстрее (хотя и немного медленнее, чем перечисление членов), но, как и перечисление членов, требует, чтобы входная коллекция находилась в памяти полностью :
(Get-ItemProperty 'C:\Program Files\McAfee').ForEach('LastWriteTime')
[1] Краткий обзор Select-Object
поведение:
Select-Object [-Property] <string[]>
возвращает пользовательский объект для каждого входного объекта, содержащий только указанные свойства; даже если указано только одно свойство, результаты представляют собой настраиваемые объекты с этим единственным свойством, а не сами значения свойства.
В отличие от этого, использование -ExpandProperty <string>
вместо этого возвращает значение заданного одиночного свойства из каждого входного объекта (набранного как есть).
Простой пример: извлеките значение свойства Year
из вызова Get-Date
:
# WRONG: with (implied) -Property
PS> $val = Get-Date | Select-Object Year; "$val"
@{Year=2018} # !!
# A custom object with a Year property was returned and the above is its
# string representation, the equivalent of:
# "$([pscustomobject] @{ Year = 2018 })"
# CORRECT: with -ExpandProperty
PS> $val = Get-Date | Select-Object -ExpandProperty Year; "$val"
2018 # OK: -ExpandProperty extracted just the property's *value*
person
mklement0
schedule
12.07.2016