Pemanggilan metode gagal karena [System.__ComObject] tidak berisi metode bernama 'Tutup' di Powershell v4.0

ini pertanyaan StackOverflow pertama saya, tetapi saya akan mencoba mengingat standar komunitas..

Saya menjalankan Office 2013 di Win7 Pro dan PoSh v4.0. Setelah menjalankan skrip berikutnya, saya menerima kesalahan berikut: "Pemanggilan metode gagal karena [System.__ComObject] tidak berisi metode bernama 'Tutup'."

$xl = New-Object -comobject Excel.Application
$xl.Visible = $false
$xl.DisplayAlerts = $false
$filepath = "C:\Users\rysullivan\Desktop\Projects\EDCautomation\attach\"
$wb1 = $xl.Workbooks.Open((Join-Path $filepath "Ryan Sullivan-Template.xlsx"))
sleep 5
$wb1.Close()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($xl)

Sesuai dengan standar penyajian kode terpendek yang akan mereproduksi kesalahan, saya mengembangkan kode di atas dari otomatisasi yang lebih besar

Powershell 4.0 dan Excel 2013 | Serangga | Work-a-round tampaknya mencapai titik yang sama. Saya mengikuti solusi thread/kultur yang ditawarkan oleh XXInvidiaXX dan kesalahan yang sama terjadi.

Masalah dengan otomatisasi Excel di PowerShell mendapat jawaban dari Roy yang menunjukkan waktunya kesalahan, tapi saya memasukkan perintah Tidur dan mencoba menjalankan perintah buka dan tutup secara terpisah, keduanya tidak berhasil.

Bantuan apa pun, terutama teori yang mendasarinya, sangat kami hargai.


person BI_Badger    schedule 26.03.2015    source sumber
comment
bukankah itu $wb1.close()?   -  person Dane Boulton    schedule 27.03.2015
comment
Dane, Terima kasih sudah kembali begitu cepat. Saya awalnya memiliki $wb1.Close() dan sedang menguji semuanya. Saya lupa mengubahnya kembali. Saya telah memperbarui judul/pertanyaan.   -  person BI_Badger    schedule 27.03.2015
comment
Saya menggunakan Win8.1, bukan Win7 tetapi saya tidak dapat meniru kesalahan tersebut. Saya membuat jalur 'Proyek\EDCautomation\attach' di desktop saya, membuat buku kerja kosong di lokasi itu bernama 'Ryan Sullican-Template.xlsx', mengubah awal string jalur menjadi $env:USERPROFILE, dan menjalankan skrip tanpa masalah. Mungkinkah ini buku kerja yang terkait dengan sesuatu yang aneh di file Anda? Mungkin tutup PS atau reboot dan coba lagi untuk memastikan tidak ada yang tersangkut di memori?   -  person TheMadTechnician    schedule 27.03.2015
comment
Semua contoh di MSDN menentukan minimal argumen opsional pertama. Mungkin coba $wb1.Close($false) atau $wb1.Close($false,$null,$false)   -  person Mathias R. Jessen    schedule 27.03.2015
comment
@ MathiasR.Jessen - Terima kasih, $wb1.Close($false) sepertinya berhasil untuk saya. Saya menghargai bantuannya!   -  person BI_Badger    schedule 27.03.2015
comment
@ MathiasR.Jessen Jika Anda ingin kredit dan mengikat halaman ini, kirimkan itu sebagai jawaban dan saya akan memberi suara positif.   -  person BI_Badger    schedule 27.03.2015


Jawaban (2)


Meskipun argumen untuk Workbook.Close() semuanya opsional, semua contoh di MSDN menyediakan setidaknya satu ( argumen SaveChanges), membuat saya yakin bahwa PowerShell tidak mengenali tanda tangan metode saat Anda tidak memberikan argumen apa pun.

Anda mungkin lebih beruntung dengan:

$wb1.Close($false)

or

$wb1.Close($false,$null,$null)

Gantikan dengan $true untuk menyimpan perubahan apa pun yang telah Anda buat

person Mathias R. Jessen    schedule 27.03.2015
comment
Menambahkan $false memecahkan masalah serupa dengan metode $OfficeObject.Quit(). Terima kasih! - person Goujon; 16.04.2020

Saya cenderung menggunakan metode Quit() pada tingkat proses Excel ($xl dalam hal ini), daripada buku kerja ($wb1).

Jadi dengan menggunakan kode Anda, akan ditulis sebagai berikut (dengan $xl.Quit() bukan $wb1.Close()):

$xl = New-Object -comobject Excel.Application
$xl.Visible = $false
$xl.DisplayAlerts = $false
$filepath = "C:\Users\rysullivan\Desktop\Projects\EDCautomation\attach\"
$wb1 = $xl.Workbooks.Open((Join-Path $filepath "Ryan Sullivan-Template.xlsx"))
sleep 5
$xl.Quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($xl)

Pastikan juga untuk menjalankannya sebagai administrator.

person Myles    schedule 09.12.2016
comment
Sebagai catatan tambahan, saya juga akan mendeklarasikan nama pengguna Anda melalui [Environment]::UserName untuk membuat skrip Anda lebih portabel - atur ke variabel (seperti $user) dan kemudian gunakan itu di tengah jalur file. Ia kemudian akan mencari folder Desktop siapa pun yang menjalankan skrip. Ini belum tentu relevan untuk proyek ini, tetapi merupakan kebiasaan yang baik untuk dilakukan. - person Myles; 09.12.2016
comment
Saya mendapatkan Method invocation failed because [System.__ComObject] does not contain a method named 'Quit'. - person HackSlash; 20.02.2020
comment
@HackSlash - versi Powershell apa yang Anda jalankan, dan apakah Anda menjalankannya sebagai administrator? - person Myles; 27.02.2020
comment
5.1.18362.628 dan ya - person HackSlash; 28.02.2020