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?
答案 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
}
}