Проблемы с автоматизацией Excel в PowerShell - PullRequest
2 голосов
/ 19 января 2009

Я пытаюсь автоматизировать обновление данных в моих отчетах Excel. Вот сценарий:

$ExcelApp = new-object -ComObject Excel.Application
$ExcelApp.Visible = $false
$ExcelApp.DisplayAlerts = $false

$Workbook = $ExcelApp.Workbooks.Open("RefreshTest.xlsx", 3, $false, 5, $null, $null, $true)
$Workbook.RefreshAll()
$Workbook.Save()

$ExcelApp.Quit()

Сценарий в порядке, но когда я пытаюсь запустить его напрямую, он показывает мне следующую ошибку:

Method invocation failed because [System.__ComObject] doesn't contain a method named 'Save'.
At line:7 char:15
+ $Workbook.Save <<<< ()
    + CategoryInfo          : InvalidOperation: (Save:String) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound

Любопытно, что если я запускаю только верхнюю часть скрипта (до метода Save), а затем вызываю метод Save, он работает нормально.

Не могли бы вы мне помочь? Он был протестирован на PowerShell V1 и PowerShell V2 (биты, установленные с Win7 Beta).

С уважением, Рафа

Ответы [ 3 ]

3 голосов
/ 20 января 2009

Ваша логика, кажется, в порядке, и это работает для меня (XP SP2 и PowerShell v2).

Непосредственно перед вызовом Save (), просто для интереса, добавьте эту строку, чтобы увидеть, что печатается:

$Workbook|Get-Member *Save*

Я пробовал с пустым файлом. Возможно, ваш файл большой? Интересно, есть ли у вас большой файл, и, возможно, нужно добавить «Start-Sleep -sec 5», может быть ...

0 голосов
/ 27 октября 2015

Я согласен, что это похоже на состояние гонки. Используемая мной идиома использует тот факт, что !$null оценивается как $true,

# create an object that may take some time to populate
$MyWorkBook = $ap.Workbooks.Add()

# wait for the methods of MyWorkBook to be populated
while(!$MyWorkBook.activate){start-sleep -milliseconds 10}

# call the method we waited for
$MyWorkBook.activate()
0 голосов
/ 01 февраля 2009

Этот скрипт прекрасно работает и для меня, как написано.

Я бы согласился с Марко, что это похоже на ошибку в состоянии гонки. Сообщение об ошибке странное, но тот факт, что оно работает, когда у вас есть пауза между загрузкой / обновлением и сохранением частей вашего скрипта, указывает на длительное время загрузки / обновления, вызывающее вашу проблему.

Попробуйте использовать функцию / командлет "Start-Sleep", предложенную Марко, и посмотрите, работает ли она.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...