2016-08-22 70 views
0

我正在嘗試查找目錄中的所有Access數據庫,並且每次都在不打開Access的情況下進行壓縮和修復。我發現下面的文章解釋瞭如何找到它們並寫入文件: Batch file to find all Access Databases,但理想情況下,我只想找到它們並且緊湊而不寫入文件。查找所有Access數據庫,並壓縮並修復

我已經搜索瞭如何調用/compact命令行功能,但我不知道如何在我找到的數據庫上執行此操作。可以寫一個.bat文件來做到這一點?喜歡的東西:

@echo off

"C:\Program Files\Microsoft Office\Office14\MSACCESS.EXE""C:\Databases\ /s" *.accdb/compact

與語法任何幫助是非常讚賞。

+0

http://ss64.com/nt/forfiles.html可能是最簡單的方法。 – Andre

+0

或標準['for' loop](http://ss64.com/nt/for.html)... – aschipfl

回答

2

考慮使用Access的專用CompactRepair方法,您可以在VBA中運行(在Access數據庫內部或外部,如在Excel宏中)。需要注意的是Compact &修復實際上會創建現有數據庫的副本並將其替換爲原始數據,因此需要進行一些文件處理。

VBA(內MSACCESS.EXE)

Sub RunCompactDBs() 
    Dim path As String 
    Dim accfile As Variant 

    path = "C:\Databases\" 
    accfile = Dir(path & "*.accdb", vbDirectory) 

    Do While Len(accfile) > 0 
     bkfile = Replace(accfile, ".accdb", "_bk.accdb") 

     ' CREATE COMPACTED BACKUP 
     Application.CompactRepair path & accfile, path & bkfile, False  
     ' COPY TO ORIGINAL PATH 
     FileCopy path & bkfile, path & accfile  
     ' DESTROY COMPACTED BACKUP 
     Kill path & bkfile      

     accfile = Dir 
    Loop 

    Set accApp = Nothing 
End Sub 

VBA(MSACCESS.EXE外)

Sub RunCompactDBs() 
    Dim path As String 
    Dim accfile As Variant 
    Dim accApp As Object 

    Set accApp = CreateObject("Access.Application") 

    path = "C:\Databases\" 
    accfile = Dir(path & "*.accdb", vbDirectory) 

    Do While Len(accfile) > 0 
     bkfile = Replace(accfile, ".accdb", "_bk.accdb") 

     accApp.CompactRepair path & accfile, path & bkfile, False  

     FileCopy path & bkfile, path & accfile       
     Kill path & bkfile 

     accfile = Dir 
    Loop 

    Set accApp = Nothing   
End Sub 

而且也沒有理由去堅持VBA。 ,可以使一個COM接口來訪問對象庫的任何語言都可以運行壓縮和修復過程像開源語言:

的Python

import os, glob, shutil 
import win32com.client 

# LAUNCH ACCESS APP 
oApp = win32com.client.Dispatch("Access.Application") 

for file in glob.glob("C:\\Databases\\*.accdb"):  
    bkfile = file.replace(".accdb", "_bk.accdb") 

    oApp.CompactRepair(file, bkfile, False) 

    shutil.copyfile(bkfile, file) 
    os.remove(bkfile) 

oApp = None 

[R

library(RDCOMClient) 

# LAUNCH ACCESS APP 
oApp = COMCreate("Access.Application") 

accfiles <- list.files(path="C:\\Databases\\", pattern="\\.accdb", full.names=TRUE) 

for (file in accfiles){  
    bkfile = sub(".accdb", "_bk.accdb", file) 

    oApp$CompactRepair(file, bkfile, FALSE) 

    file.copy(bkfile, file, overwrite = TRUE) 
    file.remove(bkfile)  
} 

oApp <- NULL 
gc() 

PHP

# LAUNCH ACCESS APP 
$acc = new COM("Access.Application", NULL, CP_UTF8) or Die ("Did not instantiate Access"); 

foreach (glob("C:\\Databases\\*.accdb") as $file) {    
    $bkfile = str_replace(".accdb", "_bk.accdb", $file); 

    $acc->Application->CompactRepair($file, $bkfile, false); 

    copy($bkfile, $file); 
    unlink($bkfile);  
} 

$acc = NULL; 
unset($acc); 
+0

感謝您選擇@Parfait!我會給他們一個嘗試,看看什麼效果最好。這是否也會檢查子文件夾或只檢查指定的目錄? –