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.