2016-10-19 90 views
0

我正在嘗試使用FC來比較文件,但想要將FC命令的輸出解析出來並聲明變量以將源文件複製到遠程文件不匹配,基本同步。批處理:重定向FC輸出,解析和聲明變量

我的代碼是非常簡單的,因爲fc做的一切,我需要:

@echo off 

set source=C:\source\ 
set remote=C:\remote\ 

fc /b %source%\*.* %remote%\*.* 

FC輸出的例子,如果文件是不同的:

00000000 47 55 
00000001 44 48 
00000002 55 61 
FC: C:\source\test.txt longer than C:\remote\test.txt 

的最後一行是什麼,我想,我會喜歡解析出文件路徑並使用它們來聲明要使用的變量

xcopy %sourcefile% %remotefile% 

這將需要能夠解析多個fc文件輸出。

+0

你知道,如果被比較的文件是不同的,但同樣大小的就不會有這樣的最後一行,所以你想只同步長度改變的文件?以及如果源文件比相應的遠程文件短?最後一行將被反轉(它總是說「長於」,沒有「短於」)... – aschipfl

+0

還有其他可能的同步:['xcopy'](http://ss64.com/nt /xcopy.html)只能用於複製新文件('/ D')和只有已經存在的文件('/ U'),或者只有具有存檔屬性集('/ M')的文件(系統設置這個只要文件被編輯); ['robocopy'](http://ss64.com/nt/robocopy.html)建立了高級同步選項... – aschipfl

+0

感謝您的洞察力。我不知道如果來源較短,FC的輸出會反轉。 FC也可以基於二進制,ASCII和/或Unicode進行比較;但是如果它可以打開並閱讀它。我會進一步研究xcopy和robocopy,看看它們是否有可能。非常感激! – Sid

回答

2

FC.EXE will set an ErrorLevel as follows

-1 Invalid syntax (e.g. only one file passed) 
0 The files are identical. 
1 The files are different. 
2 Cannot find at least one of the files. 

你的腳本可以(有一些調試echo S和copy命令由REM評論了)。

@echo off 

set "source=C:\source" 
set "remote=C:\remote" 

for /F "delims=" %%G in ('dir /B "%source%\" /A:-D') do (
    >NUL 2>&1 FC /b "%source%\%%~G" "%remote%\%%~G" 
    if errorlevel 1 (
    echo %%G files differ or remote does not exist 
    REM copy /B /Y "%source%\%%~G" "%remote%\%%~G" 
) else (
    echo %%G files match 
) 
) 

但是,ROBOCOPY.exe - Robust File and Folder Copy提供了更高級的選項,包括遞歸到子文件夾中。

如果您不能使用ROBOCOPY以任何理由,那麼上面的腳本變化如下:

@ECHO OFF 
SETLOCAL EnableExtensions 

set "sourceMain=C:\source" 
set "remoteMain=C:\remote" 

call :subFolder "%sourceMain%" "%remoteMain%" "%sourceMain%" 

rem traverse source subfolder structure 
for /F "delims=" %%g in ('dir /B /S "%source%\" /A:D 2^>NUL') do (
    call :subFolder "%sourceMain%" "%remoteMain%" "%%~g" 
) 
ENDLOCAL 
goto :eof 

:subFolder 
    rem adapted original script 
set "sourceRoot=%~1" 
set "remoteRoot=%~2" 

set "source=%~3" 
call set "remote=%%source:%sourceRoot%=%remoteRoot%%%"  compute target folder 

ECHO *** comparing "%source%" vs. "%remote%" *** 
rem next command creates target folder if it does not exists yet 
MD "%remote%" 2>NUL 

for /F "delims=" %%G in ('dir /B "%source%\" /A:-D 2^>NUL') do (
    >NUL 2>&1 FC /b "%source%\%%~G" "%remote%\%%~G" 
    if errorlevel 1 (
    echo %%G files differ or remote does not exist 
    REM copy /B /Y "%source%\%%~G" "%remote%\%%~G" 
) else (
    echo %%G files match 
) 
) 
goto :eof 

請注意,目標由Variable Edit/Replace文件夾的計算是從%%g循環體移入:subFolder子程序方便的原因:沒有需要激活delayed expansion
請注意,%%G循環保持不變。

+0

此代碼是否可以遞歸到子文件夾中? – Sid

0

(發表解決方案代表OP)

由於ashipflJosefZ我發現ROBOCOPY正是我所需要的東西。 SS64.com有一個非常適合我工作的例子;代碼如下一個鏈接到它的ROBOCOPY頁面一起:

@ECHO OFF 
SETLOCAL 

SET _source=\\FileServ1\e$\users 

SET _dest=\\FileServ2\e$\BackupUsers 

SET _what=/COPYALL /B /MIR 
:: /COPYALL :: COPY ALL file info 
:: /B :: copy files in Backup mode. 
:: /MIR :: MIRror a directory tree 

SET _options=/R:0 /W:0 /LOG:C:\batch\RoboLog.txt /NFL /NDL 
:: /R:n :: number of Retries 
:: /W:n :: Wait time between retries 
:: /LOG :: Output log file 
:: /NFL :: No file logging 
:: /NDL :: No dir logging 

ROBOCOPY %_source% %_dest% %_what% %_options% 

http://ss64.com/nt/robocopy.html