gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 02:08:57 30 4
gpt4 key购买 nike

所以我一直在尝试编写一个批处理文件,当我运行它时,它会将我的本地 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
)

它似乎工作正常。如果我在闪存驱动器上进行更改,我会运行批处理文件并键入 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。

最佳答案

根据 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.

使用 /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

或类似于下一个代码片段的内容(保留 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

请注意,如果 Command Extensions被禁用 GOTO will no longer recognise the :EOF label (在这种情况下使用 exit /B 而不是 goto :EOF)。虽然 Command Extensions are enabled by default ,我们不能假设它。这就是我使用 SETLOCAL EnableExtensions 的原因作为一般原则问题。

If Command Extensions are enabled GOTO changes as follows:

GOTO command now accepts a target label of :EOF which transfers control to the end of the current batch script file. This is an easy way to exit a batch script file without defining a label.

Type CALL /? for a description of extensions to the CALL command that make this feature useful.



另请注意 Using GOTO within parentheses - including FOR and IF commands - will break their context .

关于batch-file - 使用 robocopy 进行双向文件夹同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33022584/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com