Ошибки Word.Application ComObject в PowerShell

Мне не удается загрузить документ Word 2010 (14.0.x) в Сохранить как или Закрыть с помощью Powershell. Судя по всему интернету, он должен работать с 2.0, но у меня его больше нет.

Простой случай:

$Path = "C:\MyDoc.docx"
$Word = New-Object -comobject Word.Application
$Word.Visible = $True #Do this to close it out without task manager
$Doc = $Word.Documents.Open($Path)
$Doc.SaveAs($Path)
$Doc.Close()

На данный момент все работает до сохранения и закрытия:

Argument: '1' should be a System.Management.Automation.PSReference. Use [ref].
At line:5 char:1
+ $Doc.SaveAs($Path)
+ ~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodException
    + FullyQualifiedErrorId : NonRefArgumentToRefParameterMsg

Argument types do not match
At line:6 char:1
+ $Doc.Close()
+ ~~~~~~~~~~~~
    + CategoryInfo          : OperationStopped: (:) [], ArgumentException
    + FullyQualifiedErrorId : Argument types do not match

Кажется, что любые методы, которые Get-Member показывает как имеющие аргументы, терпят неудачу. Например, вызов простого $Doc.Save() работает нормально. Глядя на информацию MSDN об этих методах, похоже, что она использует такие вещи, как SaveChanges. метод, но это, честно говоря, выше моих навыков на данный момент.

Я пытался передать $Null или $True или $False в надежде на удачу, но он просто продолжает сопротивляться мне.

Все, что мне удалось найти, это то, что это, по-видимому, ссылка на бета-версию PS 3.0 (похоже, у людей нормально работает в версии 2.0) и комментарий Эд Уилсон не ответил.


person squid808    schedule 30.08.2012    source источник


Ответы (3)


Я также много боролся с этой ошибкой, но, наконец, обошел ее, вызвав свойство «Value» PSReference (я получил свою информацию здесь: https://msdn.microsoft.com/en-us)./library/system.management.automation.psreference(v=vs.85).aspx )

это, наконец, привело к codeLines:

$filename = [ref]"C:\Temp\pv_report.docx"    
[ref]$option = [Microsoft.Office.Interop.Word.WdSaveFormat] -as [type]
$document.SaveAs(([ref]$filename).Value, ([ref]$option::wdFormatDocumentDefault).Value)
$document.Close()
person spookycoder    schedule 12.08.2016

Вам просто нужно использовать [ref] при вызове SaveAs. Это сработало для меня:

$Path = "C:\MyDoc.docx"
$NewPath = "C:\MyDocRenamed.docx"
$Word = New-Object -comobject Word.Application
$Word.Visible = $True #Do this to close it out without task manager
$Doc = $Word.Documents.Open($Path)
$Doc.SaveAs([ref] $NewPath)
$Doc.Close()
person latkin    schedule 30.08.2012
comment
Нет кубиков, по-прежнему возникает ошибка «Типы аргументов не совпадают». Я пытался возиться с [ref] до этого, но безрезультатно. Я не совсем уверен, ЧТО должно быть упомянуто. Возможно, это больше, чем просто PS-версия? Я использую 64-разрядную версию Windows 7, бета-версию Powershell 3 и 64-разрядную версию Office 14.0.6123.5001, если это поможет. - person squid808; 30.08.2012
comment
У меня была такая же проблема, и это решение сработало для меня. Windows 7 64-разрядная, PowerShell 2. - person hshib; 02.07.2016

Это может помочь вам:

http://msdn.microsoft.com/en-us/library/office/cc626294(v=office.12).aspx#VSTO3PowerTools_OfficeInteropAPIExtensions

Расширения API взаимодействия с Office

Инструмент Office Interop API Extensions использует новые функции Microsoft .NET Framework 3.5 и Microsoft Visual C# 3.0 для переноса объектной модели Office и предоставления более продуктивной среды для разработчиков C#. В частности, он использует методы расширения, инициализаторы объектов и типы, допускающие значение NULL, для создания упрощенного, строго типизированного и, в некоторых случаях, Microsoft Visual Basic-подобного API. Это не полный управляемый API для Office, но он предназначен для полезного расширения необработанной объектной модели.

Объектная модель Office изначально предназначалась для динамических языков, таких как Microsoft Visual Basic для приложений (VBA) и Visual Basic. Таким образом, он широко использует некоторые из их возможностей, такие как позднее связывание и необязательные параметры. Будучи ранним и строго типизированным языком, C# может быть неудобным, утомительным и подверженным ошибкам при использовании в этом контексте. Расширения API Office Interop с их упрощенным и строго типизированным API позволяют разработчикам C# работать в этом контексте так же продуктивно, как и разработчикам Visual Basic.

Я знаю, что PowerShell 3.0 основан на CLR4, но эта сборка все равно загружается нормально. Это устраняет необходимость во всех параметрах [ref]. Поскольку большая часть этого API основана на методах расширения (чего нет в powershell), вам придется передать экземпляр $word или $doc в качестве первого параметра для многих методов.

person x0n    schedule 13.09.2012
comment
Попытался загрузить VSTO_PTExtLibs.exe с веб-сайта, как указано в этом документе, чтобы получить Interop Tools, но когда я попытался установить его, программа установки не удалась из-за того, что у меня не была установлена ​​Visual Studio 2008. У меня уже есть VS 2010, поэтому я не думаю, что буду устанавливать 2008 только для того, чтобы попробовать. Кроме того, я надеялся получить что-то, что будет работать на любом ПК с установленным Office, это добавит еще один необходимый компонент. А пока поищу, спасибо! - person squid808; 20.09.2012