В вашем коде есть посторонний вызов GM
(Get-Member
), и вызов Where-Object
- который должен быть там, где GM
- отключен от конвейера выше (что делает его неработоспособным).
$constants
, следовательно, представляет собой массив объектов (вывод Get-Member
), и передача массива в [enum]::GetNames()
завершается с ошибкой, которую вы видели.
Найдите исправленную версию своего кода ниже, но y наша проблема может быть решена проще , объединяя решения из сообщения, в котором ваш код получен с , как показано в этот ответ .
Вот исправленная версия вашего кода , которая также показывает более быстрое решение PSv5 + для создания пользовательскихобъект, свойства которого названы для символических имен значений перечисления, а значения свойств сами являются значениями перечисления.
Как показывает связанное более простое решение, в действительности это не является необходимым.
# Get the [enum]-derived type named 'Constants' from among
# the types that the Excel interop assembly exports.
$xl = New-Object -ComObject Excel.Application
$constantsType = $xl.GetType().Assembly.GetExportedTypes() |
Where-Object { $_.IsEnum -and $_.Name -eq 'constants' }
# Construct a custom object that reflects the enum type's
# enumeration values as properties.
$xlConstants = New-Object pscustomobject
[enum]::GetNames($constantsType).ForEach({
$xlConstants.psobject.properties.Add([psnoteproperty]::new($_, $constantsType::$_))
})
Если вы предпочитаете использоватьВ качестве значений свойств используйте значения aw [int]
, вместо них используйте [psnoteproperty]::new($_, $constantsType::$_.value__)
.
.psobject.properties
обеспечивает доступ к свойствам любого объекта, а метод .Add()
позволяет создавать свойства.[psnoteproperty]::new()
создает свойство заметки (отображается как тип NoteProperty
на Get-Member
), т. Е. Свойство со статическим значением;первый аргумент - это имя свойства, а второй - значение свойства, которое может быть любого типа.