Ошибка при преобразовании типов в объекте Powershell EXCEL Com - PullRequest
0 голосов
/ 24 марта 2019

следующий код:

$xl = New-Object -ComObject Excel.Application
$constants = $xl.gettype().assembly.getexportedtypes() | GM

where-object {$_.IsEnum -and $_.name -eq 'constants'}

$pso = new-object psobject
[enum]::getNames($constants) | foreach { $pso | Add-Member -MemberType NoteProperty $_ ($constants::$_) }
$xlConstants = $pso

Сбой в [enum]::getNames с помощью ff. сообщение от Powershell 5.1 ISE:

Cannot convert argument "enumType", with value: "System.Object[]", for "GetNames" to type "System.Type": 
"Cannot convert the "System.Object[]" value of type "System.Object[]" to type "System.Type"."
At line:9 char:1

Буду признателен за руководство.

Код был скопирован из ответа 2010 года на сообщение, в котором требовалось извлечь константы Excel Enum.

1 Ответ

0 голосов
/ 24 марта 2019

В вашем коде есть посторонний вызов 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), т. Е. Свойство со статическим значением;первый аргумент - это имя свойства, а второй - значение свойства, которое может быть любого типа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...