Aufrufen von Documents.Open für Word.Application Fehler beim Konvertieren von msoFalse in den Typ Object

745
CoveGeek

Wie kann die Documents.OpenNoRepairDialogMethode von Powershell mit allen Parametern aufgerufen werden, die mindestens bis zu dem Punkt bereitgestellt werden, an dem Word-Dokumente ohne Fehler, Dialoge oder Makros geöffnet werden; und dass Dokumente, die durch ein Kennwort geschützt sind, ohne Popup / Dialog, den ein Benutzer abweisen muss, fehlschlagen?


Der Versuch, ein Dokument mit Microsoft Office Word 2013 über Powershell zu öffnen, funktioniert für grundlegende Verwendungen der Documents.OpenMethode. Wenn Sie versuchen, Dateien zu öffnen, die Makros enthalten oder einen Kennwortschutz enthalten, wird ein Fehler oder ein Dialogfeld angezeigt, das eine Person manuell schließen muss. Dieser Prozess umfasst Hunderttausende von Dateien, daher sind Verzögerungen zeitaufwändig.

Ich habe versucht, die Documents.OpenNoRepairDialogMethode zu verwenden, um diese Dialogfelder zu umgehen und schreibgeschützte und möglicherweise beschädigte Dateien zu öffnen. Unten sehen Sie ein Beispiel für den Code, den ich zum Öffnen einer Datei verwendet habe.

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

Das Ergebnis dieses Prozesses sieht folgendermaßen aus:

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 

Ich habe auch versucht, die documents.openMethode anzuwenden :

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

In diesem Fall erhalte ich folgendes Ergebnis:

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 

Gemäß einer Referenz von Visual Basic für opennorepairdialog und einer .NET-Referenz für Documents.OpenNoRepairDialog sind die Parameter für die Methode Systemobjekte, die von PowerShell im erwarteten Format schwer zu generieren scheinen.

0

0 Antworten auf die Frage