使用powershell导出访问数据库的所有查询

时间:2016-03-02 17:04:12

标签: powershell ms-access com

This question演示了如何使用VBA执行此操作,但我想使用PowerShell执行此操作,因此可以编写脚本并进行安排。

我希望实现应该是相同的,因为它们都声称使用相同的COM,但似乎在PowerShell访问的COM中没有定义QueryDefs,因为它什么都不返回。

# Open file in Access.
$accessCOM = New-Object -ComObject Access.Application
$accessCOM.OpenCurrentDataBase($dbPath, $false)

# get list of queries
$queries = $accessCOM.CurrentDB.QueryDefs # returns nothing.

# export query to file
ForEach ($query in $queries) {
    $name = $query.name
    $sql = $query.sql
    $dest = "$queryDest\$name.sql"
    Write-Output $sql > $dest
}

我可以使用.CurrentData.AllQueries但是它会返回一组AccessObjects,我不知道如何从中获取SQL。有没有其他方法可以从名称中获取QueryDef或至少SQL?

2 个答案:

答案 0 :(得分:2)

这适用于Access 2010.它只是将非系统QueryDefs的名称转储到控制台,但它应该让你入门:

$dbe = New-Object -com DAO.DBEngine.120
$db = $dbe.OpenDatabase("C:\Users\Public\Database1.accdb")
$queries = $db.QueryDefs
ForEach ($query in $queries) {
    $name = $query.Name
    If (!$name.StartsWith("~")) {
        $name
    }
}

答案 1 :(得分:0)

请尝试修改上一篇文章。为我工作。 运行一次后,PowerShell ISE中的其他变量属性将通过IntelliSense提供。

$dbe = New-Object -com DAO.DBEngine.120
$dbpath ="path/to/data.mdb"
$db = $dbe.OpenDatabase($dbpath,$false,$false,";pwd=r3ealLy?")
$queries = $db.QueryDefs
ForEach ($query in $queries) {
    $name = $query.Name
    If (!$name.StartsWith("~")) {
       $name + ":"
       $query.SQL
    }
}