使用 robocopy 进行双向文件夹同步

Jak*_*tro 4 batch-file

所以我一直在尝试编写一个批处理文件,当我运行它时,它会将我的本地 Google Drive 文件夹与我的闪存驱动器同步。由于 robocopy 是一种单向过程,因此我设置了我的代码,以便它询问您是要同步到 Google Drive 还是从 Google Drive 同步。这样无论我制作或编辑的两个位置中的哪一个,我都可以始终将最新版本同步到两个位置。

在发生任何事情之前,该代码还会通过检查其名称来验证它是否已插入我的计算机而不是其他人的计算机。

这就是我的代码现在的样子:

@echo off
If "%computername%"=="JAKE-PC" (
color 02
set /P c=Sync TO or FROM Google Drive[T/F]?

:choice
if /I "%c%" EQU "T" goto :to
if /I "%c%" EQU "F" goto :from
goto :choice

:to
echo Syncing to Google Drive...
robocopy ".\Google Drive\ " "C:\Users\Jake\Google Drive\ " * /mir /xo
goto :done

:from
echo Syncing from Google Drive...
robocopy "C:\Users\Jake\Google Drive\ " ".\Google Drive\ " * /mir /xo
goto :done

:done
echo Sync Complete.               
pause
)

If NOT "%computername%"=="JAKE-PC" (
color 04
echo Not Jake's PC!
pause
)
Run Code Online (Sandbox Code Playgroud)

它似乎工作正常。如果我在闪存驱动器上进行更改,我会运行批处理文件并键入 T,这会将我的更改同步到 Google Drive。如果我在 Google Drive 上进行更改,我输入 F 这将同步来自 Google Drive 的更改。

然而,只有一个缺陷,那就是每个位置都有要同步的新内容。如果我在我的闪存驱动器上创建“a.txt”并在 Google Drive 上创建“b.txt”,然后如果我:

-sync TO Google Drive,a.txt 从我的闪存驱动器复制到 Google Drive,但 b.txt 从两者中消失了。

-sync FROM Google Drive, b.txt 从 Google Drive 复制到我的闪存驱动器,但 a.txt 从两者中消失了。

因此,如果两个位置都有新内容,这会导致文件永远丢失的问题。有没有什么办法解决这一问题?我只需要一种同步两个位置的双向方法,而不会丢失其中一个位置的文件/文件夹。甚至可能没有 robocopy。

Jos*_*efZ 5

根据ROBOCOPY /?(或ROBOCOPY.exe doc),/MIR选项强制隐式/PURGE

  /MIR : MIRror a directory tree - equivalent to /PURGE plus all subfolders (/E)
/PURGE : Delete destination files/folders that no longer exist in source.
   /XO : eXclude Older - if destination file exists and is the same date or newer
                         than the source - don’t bother to overwrite it.
    /E : Copy Subfolders, including Empty Subfolders.
Run Code Online (Sandbox Code Playgroud)

使用/E代替/MIR选项并在无人看管的情况下以两种方式执行复制:

@echo off

If "%computername%"=="JAKE-PC" goto :sync
color 04
echo Not Jake's PC!
goto :done

:sync
color 02

:to
echo Syncing to Google Drive...
robocopy ".\Google Drive\\" "C:\Users\Jake\Google Drive\\" * /E /XO

:from
echo Syncing from Google Drive...
robocopy "C:\Users\Jake\Google Drive\\" ".\Google Drive\\" * /E /XO

echo Sync Complete.               

:done
pause
Run Code Online (Sandbox Code Playgroud)

或类似于下一个代码片段的内容(保留set /P用户的询问):

@echo off
SETLOCAL EnableExtensions
If "%computername%"=="JAKE-PC" goto :sync
color 04
echo Not Jake's PC!
goto :done

:to
echo Syncing to Google Drive...
robocopy ".\Google Drive\\" "C:\Users\Jake\Google Drive\\" * /E /XO
goto :eof

:from
echo Syncing from Google Drive...
robocopy "C:\Users\Jake\Google Drive\\" ".\Google Drive\\" * /E /XO
goto :eof

:sync
color 02
set /P c=Sync TO or FROM Google Drive or BOTH or NOTHING [T/F/B/N]?
if /I "%c%" EQU "T" ( call :to
  goto :done  
)
if /I "%c%" EQU "F" ( call :from
  goto :done  
)
if /I "%c%" EQU "B" (
  call :to
  call :from
  goto :done  
)
if /I not "%c%" EQU "N" goto :sync
echo No Sync 

:done
echo Sync Complete.               
pause
Run Code Online (Sandbox Code Playgroud)

请注意,如果禁用命令扩展GOTO将不再识别:EOF标签(使用exit /B而不是goto :EOF在情况下)。尽管默认情况下启用了命令扩展,但我们不能对其进行假设。这就是为什么我将其SETLOCAL EnableExtensions用作一般原则。

如果启用命令扩展,则GOTO更改如下:

GOTO命令现在接受一个目标标签,:EOF该标签将控制转移到当前批处理脚本文件的末尾。这是一种无需定义标签即可退出批处理脚本文件的简单方法。

键入命令CALL /? 的扩展说明CALL,使此功能有用。

另请注意,在括号内使用GOTO- 包括FORIF命令 - 将破坏它们的上下文


wOx*_*xOm 4

/XX切换到eXclude eXtra files and directories应该按照这个答案做你需要做的事情:

目标中存在“额外”文件,但源中不存在;排除额外内容将防止从目的地删除任何内容。