2016-02-17 18 views
8

Devo aprire il file excel con il parametro CorruptLoad da PowerShell. Ma quando provo a farlo, ottengo un errore Exception calling "Open" with "15" argument(s): "open method workbooks class failed". Questo errore si verifica solo quando chiamo Open con tutti e 15 gli argomenti. E quando provo ad aprire lo stesso file excel con il programma VB.net con 15 argomenti o con il valore di specifica dell'argomento con nome CorruptLoad, non ci sono problemi!Errore durante l'apertura di Excel in PowerShell

Sto usando powershell v 4.0, Office 2010 con SP2 e .NET Framework 4.5.2.

Ecco il mio codice powershell:

$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 

non ho idea del perché si verifica un errore. Sarò lieto di eventuali consigli e ipotesi!

+0

Se avete bisogno di usare 'CorruptLoad' Perché non avete specificato nella lista degli argomenti? Lo hai come "$ mancante"? https://msdn.microsoft.com/en-us/library/office/ff193596.aspx. – Matt

+0

@Matt, ho provato tutte le varianti di chiamata alla funzione 'Open'. Ho cambiato il mio codice di esempio per mostrarlo. – Indian

+0

Grazie per il chiarimento. – Matt

risposta

7

Dopo aver giocato a lungo con il tuo script PowerShell ... è tutto molto strano.

rilevati comportamenti

In primo luogo, il metodo Open sulle cartelle di lavoro oggetto riferisce solo 14 parametri quando $excel.Workbooks.Open.Invoke.ToString() viene eseguito. L'ouptut legge:

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

Tuttavia, v'è un certo tipo di metodo di sovraccarico per 15 parametri perché, quando si utilizza l'errore più dettagliato Lettura $Error[0]|format-list -force ho fatto due chiamate di prova, la prima con 15 parametri e la seconda con 16.

15 Parametri

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 Parametri

Come si può leggere sopra, il metodo supporta 15 parametri ma non 16. Tuttavia, indipendentemente dai valori forniti al 15 ° parametro, non riuscirà ad aprire il file.

Per la cronologia, funziona con 14 o meno argomenti, è solo il 15 ° argomento che genera l'eccezione.

Conclusione

Da tutto quello che ho visto, posso solo concludere che c'è un problema con il supporto di interoperabilità di Excel COM in PowerShell. Fornire il 15 ° parametro come $missing semplicemente non dovrebbe modificare il comportamento in base allo Workbooks.Open() reference. Il problema con il supporto COM di Excel di PowerShell è ulteriormente rafforzato perché, quando lo script VBA viene eseguito come macro, tutto funziona come da documentazione.

consigliata Passi successivi

Il work-around primo che mi viene in mente è quello di scrivere la sceneggiatura VBA come una macro e conservarla in un file excel che viene utilizzato specificamente per l'esecuzione di script VBA dalla riga di comando. Ci vorrebbe uno sforzo minimo per implementare ed è noto testando sia l'OP che me stesso che funzionerà.

Se avete qualche difficoltà a innescare la macro da PowerShell, vedere Calling Excel macros from PowerShell with arguments

+0

Peter, grazie per l'idea con le macro da un altro file! E con il componente COM di Excel ci sono situazioni interessanti: su un altro server con 'Office 2010' SP2, PowerShell 2.0 e' .NET Framework 4.0 'questo problema non si verifica. – Indian

+0

@Indian Non ho ambienti simili, quindi non posso confermarlo. Abbiamo prove abbastanza considerevoli di un bug; quindi, se lo desideri, puoi inviarlo a Microsoft qui: https://connect.microsoft.com/PowerShell Le informazioni nella mia risposta dovrebbero fornire una buona base per la segnalazione del bug. – Marvin

+0

Connessione migrata a https://windowsserver.uservoice.com/forums/301869- powerhouse –