Como pode o Documents.OpenNoRepairDialog O método pode ser invocado pelo PowerShell com todos os parâmetros fornecidos pelo menos até o ponto em que os documentos do Word abrem sem erros, diálogos ou macros; e que os documentos protegidos por senha falharão com nenhum popup / diálogo que um usuário deve dispensar?


A tentativa de abrir um documento com o Microsoft Office Word 2013 através do PowerShell funciona para utilizações básicas do Documents.Open método. A tentativa de abrir arquivos que contenham macros ou conter proteção por senha resulta em um erro ou diálogo que uma pessoa deve dispensar manualmente. Esse processo é executado em centenas de milhares de arquivos, portanto, qualquer atraso é proibitivo.

Eu tentei usar o Documents.OpenNoRepairDialog método para ignorar essas caixas de diálogo e abrir arquivos somente leitura e possivelmente corrompidos. Abaixo está uma amostra do código que usei para abrir um arquivo.

# 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)

O resultado desse processo é semelhante ao seguinte:

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

Eu também tentei fazer uso do documents.open método:

$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)

Nesse caso, recebo o seguinte resultado:

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

De acordo com a referência do Visual Basic para opennorepairdialog e uma referência .NET para Documents.OpenNoRepairDialog , os parâmetros para o método são objetos do sistema que o powershell parece ter dificuldade em gerar no formato esperado.

CoveGeek
fonte