Сжать и восстановить базу данных Access 2007 с помощью Powershell

Я пытаюсь использовать Powershell V2.0 для программного сжатия и восстановления баз данных MS Access 2007 (.accdb). Код, который я создал ниже, работает как часть окончательного кода (перед запуском этой функции выполняется несколько процедур резервного копирования).

У меня возникли проблемы, поскольку все базы данных защищены паролем, и мне нужно запустить скрипт без того, чтобы пользователю приходилось вводить пароли вручную. Вот мой код:

Param([string]$strDBPath,[string]$strBUPath,[string]$strPwd)

$ErrorActionPreference = "Stop"

function CompactAndRepairDB {

    regsvr32 "C:\Program Files\Common Files\Microsoft Shared\DAO\dao360.dll"
    regsvr32 "C:\Program Files\Microsoft Office\Office12\Acedao.dll"
    regsvr32 "C:\WINNT\assembly\Microsoft.Office.Interop.Access.Dao\12.0.0.__71e9bce111e9429c\Microsoft.Office.Interop.Access.Dao.dll"

    $Database = New-Object -ComObject Microsoft.Office.Interop.Access.Dao.DBEngine
    $Database.CompactRepair($strDBPath,$strBUPath,"","",";pwd=" + $strPwd)

    Remove-Item $strDBPath
    Rename-Item $strBUPath $strDBPath
}

CompactAndRepairDB

Код выдает ошибку, как показано ниже:

Не удается загрузить COM-тип Microsoft.Office.Interop.Access.Dao.DBEngine. По адресу U: \ Scripts \ CompactRepairDatabase.ps1: 11 символов: 27 + $ Database = New-Object ‹------------------------------------------------ -ComObject Microsoft.Office.Interop.Access.Dao.DBEngine + CategoryInfo: InvalidType: (:) [New-Object ], PSArgumentException + FullyQualifiedErrorId: CannotLoadComObjectType, Microsoft.PowerShell.Commands.NewObjectCommand

Как мне загрузить правильную библиотеку / COM-объект для завершения операции или есть альтернативный метод для реализации метода .CompactRepair с использованием пароля? Спасибо


person Gareth    schedule 08.08.2014    source источник
comment
Есть ли смысл в пароле, если вы собираетесь включить его в скрипт?   -  person Fionnuala    schedule 08.08.2014
comment
@Fionnuala Скрипт хранится в безопасном месте, доступ к которому может получить только одна учетная запись пользователя, поэтому меня не беспокоит доступ к скрипту.   -  person Gareth    schedule 08.08.2014


Ответы (2)


Удалите -ComObject из строки:

$Database = New-Object -ComObject Microsoft.Office.Interop.Access.Dao.DBEngine

Microsoft.Office.Interop.Access.Dao.DBEngine будет управляемой оболочкой взаимодействия вокруг DAO.DBEngine, поэтому переключатель -ComObject вам не понадобится.

person Kev    schedule 09.08.2014
comment
Спасибо за ответ, я все еще получаю сообщение об ошибке Cannot find type [Microsoft.Office.Interop.Access.Dao.DBEngine]: make sure the assembly containing this type is loaded. Есть идеи? - person Gareth; 11.08.2014
comment
Привет, Кев; ваше отображаемое имя вызывает некоторые проблемы ... meta.stackoverflow.com/questions / 269262 /; Я собираюсь сейчас сменить имя на Кев - можете ли вы рассмотреть менее разрушительный визуальный ряд? Для справки - старое значение: K̨̩̭͚̘̗̻̞͈͖̙͙e̗̦̼̳̣̦͜͡v̢̝̟̗̱̯͉. - person Marc Gravell; 20.08.2014

Попробуй это:

Add-Type -AssemblyName Microsoft.Office.Interop.Access
$File =  "Your.accdb"
$DbEng = new-object Microsoft.Office.Interop.Access.Dao.DBEngineClass # no square bracket []
$Db = $DbEng.OpenDatabase($File)
$Db
person Johnson Cheung    schedule 18.12.2018