Вызов Documents.Open for Word.Application Ошибка преобразования msoFalse в тип Object

505
CoveGeek

Как Documents.OpenNoRepairDialogметод может вызываться PowerShell со всеми параметрами, предоставленными, по крайней мере, до того момента, когда текстовые документы открываются без ошибок, диалогов или макросов; и что документы, защищенные паролем, потерпят неудачу без всплывающих окон / диалогов, которые пользователь должен отклонить?


Попытка открыть документ в Microsoft Office Word 2013 с помощью powershell работает для базового использования Documents.Openметода. Попытка открыть файлы, которые содержат макросы или защиту паролем, приводит к ошибке или диалоговому окну, которое пользователь должен вручную закрыть. Этот процесс проходит через сотни тысяч файлов, поэтому любые задержки являются непомерными по времени.

Я попытался использовать Documents.OpenNoRepairDialogметод, чтобы обойти эти диалоги и открыть только для чтения и, возможно, поврежденные файлы. Ниже приведен пример кода, который я использовал для открытия файла.

# Enable Office core libraries Add-type -AssemblyName office  # Doc open parameter array $DOCOpen = @{} $DOCOpen.FileName=[string]"<Full Path to File>" $DOCOpen.ConfirmConversions=[Microsoft.Office.Core.MsoTriState]::msoFalse $DOCOpen.ReadOnly=[Microsoft.Office.Core.MsoTriState]::msoTrue $DOCOpen.AddToRecentFiles=[Microsoft.Office.Core.MsoTriState]::msoFalse $DOCOpen.PasswordDocument=$Null $DOCOpen.PasswordTemplate=$Null $DOCOpen.Revert=[Microsoft.Office.Core.MsoTriState]::msoTrue $DOCOpen.WritePasswordDocument=$Null $DOCOpen.WritePasswordTemplate=$Null $DOCOpen.Format=[Microsoft.Office.Interop.Word.WdOpenFormat]::wdOpenFormatAuto $DOCOpen.Encoding=[Microsoft.Office.Core.MsoEncoding]::msoEncodingOEMUnitedStates $DOCOpen.Visible=[Microsoft.Office.Core.MsoTriState]::msoFalse $DOCOpen.OpenAndRepair=[Microsoft.Office.Core.MsoTriState]::msoFalse $DOCOpen.DocumentDirection=[Microsoft.Office.Interop.Word.WdDocumentDirection]::wdLeftToRight $DOCOpen.NoEncodingDialog=[Microsoft.Office.Core.MsoTriState]::msoTrue $DOCOpen.XMLTransform=$Null $DOCOpen.OpenConflictDocument=[Microsoft.Office.Core.MsoTriState]::msoFalse  # Create MS Office object $appWord = New-Object -ComObject Word.Application  # Set application objecs not visible $appWord.visible = $False  # Supress alerts or dialogs $appWord.DisplayAlerts = "wdAlertsNone" # $wdAlertsNone #   # Supress document macros $appWord.AutomationSecurity = "msoAutomationSecurityForceDisable"  # Word specific settings $appWord.ScreenUpdating = $False $appWord.DisplayRecentFiles = $False $appWord.DisplayScrollBars = $False  $DOCDocument = $appWord.Documents.OpenNoRepairDialog($DOCOpen.FileName, $DOCOpen.ConfirmConversions, $DOCOpen.ReadOnly, $DOCOpen.AddToRecentFiles, $DOCOpen.PasswordDocument, $DOCOpen.PasswordTemplate, $DOCOpen.Revert, $DOCOpen.WritePasswordDocument, $DOCOpen.WritePasswordTemplate, $DOCOpen.Format, $DOCOpen.Encoding, $DOCOpen.Visible, $DOCOpen.OpenAndRepair, $DOCOpen.DocumentDirection, $DOCOpen.NoEncodingDialog, $DOCOpen.XMLTransform) 

Результат этого процесса выглядит следующим образом:

Object reference not set to an instance of an object. At <Full path to file>\temp_Test_PowerShell_Code.ps1:41 char:3 + $DOCDocument = $appWord.Documents.OpenNoRepairDialog($FileRec.FileN ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : OperationStopped: (:) [], NullReferenceException + FullyQualifiedErrorId : System.NullReferenceException 

Я также попытался использовать documents.openметод:

$DOCDocument = $appWord.Documents.Open($FileRec.FileName, $DOCOpen.ConfirmConversions, $DOCOpen.ReadOnly, $DOCOpen.AddToRecentFiles, $DOCOpen.PasswordDocument, $DOCOpen.PasswordTemplate, $DOCOpen.Revert, $DOCOpen.WritePasswordDocument, $DOCOpen.WritePasswordTemplate, $DOCOpen.Format, $DOCOpen.Encoding, $DOCOpen.Visible, $DOCOpen.OpenConflictDocument, $DOCOpen.OpenAndRepair, $DOCOpen.DocumentDirection, $DOCOpen.NoEncodingDialog) 

В этом случае я получаю следующий результат:

Exception setting "Open": Cannot convert the "msoTrue" value of type "MsoTriState" to type "Object". At <Full path to file>\temp_Test_PowerShell_Code.ps1:41 char:3 + $DOCDocument = $appWord.Documents.Open($FileRec.FileName, $DOCOpen. ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodException + FullyQualifiedErrorId : RuntimeException 

Согласно справочному руководству по Visual Basic для opennorepairdialog и справочному руководству по .NET для Documents.OpenNoRepairDialog, параметры для этого метода являются системными объектами, которые PowerShell, похоже, с трудом генерирует в ожидаемом формате.

0

0 ответов на вопрос

Похожие вопросы