2016-02-17 18 views
8

Ich muss Excel-Datei mit CorruptLoad Parameterer von Powershell-Skript öffnen. Aber wenn ich es versuche, erhalte ich einen Fehler Exception calling "Open" with "15" argument(s): "open method workbooks class failed". Dieser Fehler tritt nur auf, wenn ich Open mit allen 15 Argumenten aufrufen. Und wenn ich versuche, die gleiche Excel-Datei mit VB.net Programm mit 15 Argumente oder mit Angabe von Wert des benannten Arguments CorruptLoad zu öffnen, gibt es kein Problem!Fehler beim Öffnen Excel in Powershell

Ich verwende powershell v 4.0, Office 2010 mit SP2 und .NET Framework 4.5.2.

Hier ist mein powershell Code:

$excel = New-Object -ComObject Excel.Application 
$excel.Visible = $false 
try 
{ 
    $missing = [System.Type]::Missing 
# $wb = $excel.Workbooks.Open("d:\temp\start_instrument.xls", $missing, $missing, $missing, $missing, 
#        $missing, $missing, $missing, $missing, $missing, 
#        $missing, $missing, $missing, $missing, $missing) 

# $wb = $excel.Workbooks.Open("d:\temp\start_instrument.xls", $missing, $missing, $missing, $missing, 
#        $missing, $missing, $missing, $missing, $missing, 
#        $missing, $missing, $missing, $missing, 1) 

    $XlCorruptLoad = "Microsoft.Office.Interop.Excel.XlCorruptLoad" -as [type] 

    $wb = $excel.Workbooks.Open("d:\temp\start_instrument.xls", $missing, $missing, $missing, $missing, 
           $missing, $missing, $missing, $missing, $missing, 
           $missing, $missing, $missing, $missing, $XlCorruptLoad::xlRepairFile)  
} 
catch 
{ 
    Write $Error[0].ToString() 
} 

# some stuff 

if ($excel -ne $null) 
{ 
    $excel.Quit() 

    [System.Runtime.InteropServices.Marshal]::ReleaseComObject($excel) | Out-Null 
    $excel = $null 
} 

[System.GC]::Collect() | Out-Null 
[System.GC]::WaitForPendingFinalizers() | Out-Null 

Ich habe keine Ahnung, warum Fehler auftritt. Ich werde mich über alle Ratschläge und Annahmen freuen!

+0

Wenn Sie verwenden müssen 'CorruptLoad' warum haben Sie es nicht in der Argumentliste angegeben? Sie haben es als "$ fehlt"? https://msdn.microsoft.com/en-us/library/office/ff193596.aspx. – Matt

+0

@Matt, habe ich alle Varianten der Aufruf 'Open' Funktion versucht. Ich habe mein Codebeispiel geändert, um es anzuzeigen. – Indian

+0

Danke für die Klarstellung. – Matt

Antwort

7

Nachdem Sie viel mit Ihrem PowerShell-Skript herumgespielt haben, ist alles sehr merkwürdig.

beobachtetem Verhalten

Zunächst wird die Open-Methode auf den Arbeitsmappen Objekt meldet nur 14 Parameter, wenn $excel.Workbooks.Open.Invoke.ToString() ausgeführt wird. Die ouptut lautet:

Workbook Open (string, Variant, Variant, Variant, Variant, Variant, Variant, Variant, Variant, Variant, Variant, Variant, Variant, Variant, Variant) 

Allerdings gibt es eine Art von Überlastung Methode für 15 Parameter, da bei Verwendung des ausführlichere Fehlerauslese $Error[0]|format-list -force ich habe zwei Testanrufe, die erste mit 15 Parameter und die zweite mit 16.

15 Parameter

Exception    : System.Runtime.InteropServices.COMException (0x800A03EC): Unable to get the Open property of the Workbooks class 
          at System.Management.Automation.Interpreter.MethodInfoCallInstruction.InvokeInstance(Object instance, Object[] args) 
          at System.Management.Automation.Interpreter.DynamicInstructionN.Run(InterpretedFrame frame) 
          at System.Management.Automation.Interpreter.EnterTryCatchFinallyInstruction.Run(InterpretedFrame frame) 

16 Parameter

Wie Sie oben lesen können, unterstützt die Methode 15 Parameter, jedoch nicht 16. Unabhängig davon, welche Werte dem 15. Parameter übergeben werden, kann die Datei nicht geöffnet werden.

Für den Datensatz funktioniert es mit 14 oder weniger Argumente, es ist nur das 15. Argument, das die Ausnahme auslöst.

Fazit

Von allem, was ich gesehen habe, kann ich nur feststellen, dass es ein Problem mit der in Powershell-Unterstützung Excel COM-Interop ist. Die Versorgung des 15. Parameters als $missing sollte einfach nicht das Verhalten gemäß der Workbooks.Open() reference ändern. Es gibt ein Problem mit Powershells Excel COM-Unterstützung wird weiter verstärkt, da, wenn das VBA-Skript als Makro ausgeführt wird, alles gemäß der Dokumentation funktioniert.

Empfohlene Nächste Schritte

Die erste Behelfslösung, dass in den Sinn kommt, ist das VBA-Skript als Makro und speichern Sie es in einer Excel-Datei zu schreiben, die speziell für die Ausführung von VBA-Scripts von der Kommandozeile verwendet wird. Es würde nur minimalen Aufwand erfordern, um es zu implementieren, und es ist bekannt, dass es sowohl vom OP als auch von mir testet, dass es funktioniert.

Wenn Sie Schwierigkeiten haben, das Makro von Powershell-Triggerung finden Calling Excel macros from PowerShell with arguments

+0

Peter, danke für die Idee mit Makros aus einer anderen Datei! Und mit Excel COM-Komponente gibt es interesting Situation: auf einem anderen Server mit 'Office 2010' SP2, Powershell 2.0 und' .NET Framework 4.0' tritt dieses Problem nicht auf. – Indian

+0

@Indian Ich habe keine vergleichbaren Umgebungen, daher kann ich das nicht bestätigen. Wir haben ganz erhebliche Beweise für einen Fehler; Wenn Sie es wünschen, können Sie es hier bei Microsoft einreichen: https://connect.microsoft.com/PowerShell Die Informationen in meiner Antwort sollten eine gute Grundlage für den Fehlerbericht bieten. – Marvin

+0

Verbinden Sie migriert zu https://windowsserver.uservoice.com/forums/301869-powershell –

Verwandte Themen