2015-04-01 85 views
1

我試圖使用XCOPY從Outlook備份.PST文件,並且只備份自上次使用以來已更改的備份文件。我可以使用XCOPY只複製已更改大小的文件嗎?

通常情況下,使用/ d開關僅保存具有更新修改日期的文件,但Outlook在打開日期時會更改日期,無論內容是否已更改。

是否可以使用IF語句來比較文件大小,只有在文件大小不同(不一定大或小)時才備份?

目前正在使用:

XCOPY /m /f /i /y c:\*.pst \\NetworkLocation\%USERNAME%\BACKUP 

感謝

+1

如果_content_更改保持文件_size_不變? – JosefZ 2015-04-01 15:24:23

+1

離開XCOPY並轉到[ROBOCOPY](https://technet.microsoft.com/en-us/library/cc733145.aspx)。它旨在取代XCOPY並提供更多功能。 – Jeeped 2015-04-01 16:01:43

回答

0

其實,這是令人難以置信的用於複製的工具無法「更新」的目標文件。至少XCOPY不能,ROBOCOPY AFAIK也不能。
此批處理文件是笨拙,但能夠完成任務:

@echo off 
:: copy files to TARGETDIR if different, modified date or size or name 
set TARGETDIR=BACKUP 
for %%f in (*.pst) do CALL :COPY_CHANGED %%f %TARGETDIR% 
goto :EOF 


:COPY_CHANGED 
    set saved=(None) 
    set live="%~1" 
    if not exist "%~2\%~1" goto :DO_COPY 
    rem compare file metadata of %1 in current dir and dir %2 
    pushd "%~2" 
    for /f "tokens=3 usebackq" %%a in (`dir "%~1" ^| findstr /C:"%~1" ^|^| echo --- `) do set saved=%%a 
    popd 
    for /f "tokens=3 usebackq" %%a in (`dir "%~1" ^| findstr /C:"%~1"`) do set live=%%a 
    if "%live%".=="%saved%". goto :EOF 
:DO_COPY 
    echo original: %live% 
    echo backup: %saved% 
    xcopy "%~1" "%~2" /F /Y 
    goto :EOF 

您將需要調整XCOPY選擇您的需求。子程序中的echo行可以被刪除。
對於每個文件,批處理文件在源文件夾中收集一次文件大小,然後在目標文件夾中收集文件大小,並使用dir逐字比較它們。如果相等,文件被跳過,否則它是XCOPY'd。

+0

謝謝,這個工程,但我不希望它比較修改時間,只是大小。有沒有辦法做到這一點?我想我必須修改('dir「%〜1」^ | findstr/C:「%〜1」中的/ f「tokens = * usebackq」%% a)^^^ echo ---' )do set saved = %% a – Luke 2015-04-02 12:03:18

+0

只需用'tokens = 3'替換'tokens = *'即可。我會相應地編輯我的答案。 – user1016274 2015-04-02 12:16:58

相關問題