2016-03-25 6 views
0

Я пытаюсь расширить this example с помощью extarnal module, чтобы вызвать общие методы. Моя цель - создать новый файл xls и написать ему.New-Object возвращает пустой объект

[Reflection.Assembly]::LoadWithPartialName("DocumentFormat.OpenXml") | Out-Null 
[Reflection.Assembly]::LoadWithPartialName("DocumentFormat.OpenXml.Packaging") 
[Reflection.Assembly]::LoadWithPartialName("DocumentFormat.OpenXml.Spreadsheet") 
[Reflection.Assembly]::LoadWithPartialName("OpenXmlPowerTools") 

Import-Module (join-path (Split-Path $MyInvocation.MyCommand.Path) "GenericMethods.psm1") 

$document = [DocumentFormat.OpenXml.Packaging.SpreadsheetDocument]::Create("C:\Temp\text.xlsx", [DocumentFormat.OpenXml.SpreadsheetDocumentType]::Workbook) 

$workbookPart = $document.AddWorkbookPart(); 
$workbookPart.Workbook = New-Object -TypeName DocumentFormat.OpenXml.Spreadsheet.Workbook 

$worksheetPart = Invoke-GenericMethod -InputObject $workbookPart -MethodName AddNewPart -GenericType DocumentFormat.OpenXml.Packaging.WorksheetPart 
$sheetData = New-Object -TypeName DocumentFormat.OpenXml.Spreadsheet.SheetData 
$worksheetPart.Worksheet = New-Object -TypeName DocumentFormat.OpenXml.Spreadsheet.Worksheet -ArgumentList $sheetData 

[DocumentFormat.OpenXml.Spreadsheet.Sheets]$foo = New-Object -TypeName DocumentFormat.OpenXml.Spreadsheet.Sheets 
Invoke-GenericMethod -InputObject $document.WorkbookPart.Workbook -MethodName AppendChild -GenericType DocumentFormat.OpenXml.Spreadsheet.Sheets -ArgumentList $foo 

$document.Close() 

Проблема заключается в том, что этот кусок кода

[DocumentFormat.OpenXml.Spreadsheet.Sheets]$foo = New-Object -TypeName DocumentFormat.OpenXml.Spreadsheet.Sheets 
Invoke-GenericMethod -InputObject $document.WorkbookPart.Workbook -MethodName AppendChild -GenericType DocumentFormat.OpenXml.Spreadsheet.Sheets -ArgumentList $foo 

бросает ошибку Invoke-GenericMethod : No matching method was found. Броски, потому что New-Object создает что-то, что рассматривается как пустой массив функцией Invoke-GenericMethod. Таким образом, модуль ищет общие методы без параметров. Обратите внимание, что первый звонок на Invoke-GenericMethod работает нормально.

Как мне позвонить Invoke-GenericMethod с параметром -ArgumentList?

+1

'-ArgumentList (, $ foo)'? – PetSerAl

+0

'Invoke-GenericMethod' не является встроенным командлетом PowerShell. См. [Этот вопрос] (http://stackoverflow.com/q/18774889/1001100) для получения дополнительной информации. – JamesQMurphy

+0

@PetSerAl Это сработало. Но я не понимаю, почему. И теперь пустой объект возвращается вызванным методом. –

ответ

2

Проблема с вашим кодом в том, что DocumentFormat.OpenXml.OpenXmlElement класс (базовый класс для DocumentFormat.OpenXml.Spreadsheet.Sheets) реализовать интерфейс IEnumerable. Это делает PowerShell интерпретировать любой экземпляр DocumentFormat.OpenXml.Spreadsheet.Sheets как коллекцию, а не особый объект.

Когда вы пишете только

$foo 

PowerShell Перечислим сбора и отображения дочерних элементов вместо (чтобы быть точным, вы будете видеть ребенка ребенка, потому что форматирование командлеты обычно делают другое перечисление коллекций). И так как вы только что создали этот объект, он будет пустым и ничего не будет отображаться.

Чтобы реально отобразить $foo сам объект, вам нужно написать так:

,$foo | Format-Table -Expand CoreOnly 

или

,,$foo 

Тот факт, что PowerShell интерпретировать экземпляр DocumentFormat.OpenXml.Spreadsheet.Sheets как коллекции, также как она влияет на конверсию до [Object[]] (тип -ArgumentList параметр) сделано. Вместо того, чтобы обертывать массив одиночных элементов (как вы хотите вызвать метод с единственным аргументом), как это происходит для особых объектов, PowerShell создает массив из элементов коллекции.

Чтобы решить вашу проблему, вам необходимо сделать обертывание в один массив элементов самостоятельно. Вы можете сделать это с помощью унарного запятой:

-ArgumentList (,$foo) 
Смежные вопросы