Не удалось вызвать метод, поскольку [System.__ComObject] не содержит метод с именем «Закрыть» в Powershell v4.0

это мой первый вопрос о StackOverflow, но я постараюсь учитывать стандарты сообщества.

Я использую Office 2013 на Win7 Pro и PoSh v4.0. При выполнении последующего сценария я получаю следующую ошибку: "Вызов метода не выполнен, поскольку [System.__ComObject] не содержит метод с именем "Закрыть"".

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

В соответствии со стандартом представления кратчайшего кода, воспроизводящего ошибку, я разработал приведенный выше код на основе более крупной автоматизации.

Powershell 4.0 и Excel 2013 | Ошибка | Work-a-round, похоже, приближается к той же точке. Я следовал решению потока/культуры, предложенному XXInvidiaXX, и возникла та же ошибка.

На Проблемы с автоматизацией Excel в PowerShell был ответ Роя, который указывал на время ошибка, но я вставил команду Sleep и попытался запустить команды открытия и закрытия по отдельности, обе безрезультатно.

Любая помощь, особенно базовая теория, приветствуется.


person BI_Badger    schedule 26.03.2015    source источник
comment
разве это не $wb1.close()?   -  person Dane Boulton    schedule 27.03.2015
comment
Дэн, спасибо, что так быстро вернулись. Изначально у меня была $wb1.Close(), и я все проверял. Я забыл изменить его обратно. Я обновил заголовок/вопрос.   -  person BI_Badger    schedule 27.03.2015
comment
Я использую Win8.1 вместо Win7, но не могу воспроизвести ошибку. Я создал путь «Projects\EDCautomation\attach» на своем рабочем столе, создал в этом месте пустую книгу с именем «Ryan Sullican-Template.xlsx», изменил начало строки пути на $env:USERPROFILE и запустил скрипт без проблем. Может ли эта книга быть связана с чем-то странным в вашем файле? Может быть, закрыть PS или перезагрузиться и попробовать еще раз, чтобы убедиться, что это не застряло в памяти?   -  person TheMadTechnician    schedule 27.03.2015
comment
Все примеры в MSDN указывают как минимум первый необязательный аргумент. Может попробовать $wb1.Close($false) или $wb1.Close($false,$null,$false)   -  person Mathias R. Jessen    schedule 27.03.2015
comment
@MathiasR.Jessen - Спасибо, $wb1.Close($false), похоже, сработало для меня. Я ценю помощь!   -  person BI_Badger    schedule 27.03.2015
comment
@MathiasR.Jessen Если вы хотите получить кредит и связать страницу, отправьте это как ответ, и я проголосую.   -  person BI_Badger    schedule 27.03.2015


Ответы (2)


Несмотря на то, что аргументы Workbook.Close() являются необязательными, все примеры в MSDN содержат как минимум один ( аргумент SaveChanges), что навело меня на мысль, что PowerShell не распознает сигнатуру метода, если вы не предоставляете никаких аргументов.

Возможно, вам повезет больше:

$wb1.Close($false)

or

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

Замените на $true, чтобы сохранить любые изменения, которые вы, возможно, сделали

person Mathias R. Jessen    schedule 27.03.2015
comment
Добавление $false решает аналогичную проблему с методом $OfficeObject.Quit(). Спасибо! - person Goujon; 16.04.2020

Я предпочитаю использовать метод Quit() на уровне процесса Excel (в данном случае $xl), а не рабочей книги ($wb1).

Таким образом, используя ваш код, он будет записан следующим образом (с $xl.Quit() вместо $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)

Также не забудьте запустить его от имени администратора.

person Myles    schedule 09.12.2016
comment
В качестве примечания я бы также объявил ваше имя пользователя через [Environment]::UserName, чтобы сделать ваш скрипт более переносимым — установите для него переменную (например, $user), а затем используйте ее в середине пути к файлу. Затем он будет искать папку «Рабочий стол» того, кто запускает скрипт. Это не обязательно актуально для этого проекта, но это хорошая привычка. - person Myles; 09.12.2016
comment
Я получаю Method invocation failed because [System.__ComObject] does not contain a method named 'Quit'. - person HackSlash; 20.02.2020
comment
@HackSlash - какую версию Powershell вы используете и используете ли вы ее как администратор? - person Myles; 27.02.2020
comment
5.1.18362.628 и да - person HackSlash; 28.02.2020