@ECHO OFF
SETLOCAL
:: establish source and destination directorynames; ensure dest exists
SET source=c:\folder-a
SET dest=u:\folder-b
MD %dest% 2>NUL
:: delete a tempfile if it exists
DEL "%temp%\svntmp2.tmp" 2>nul
:: create a dummy directory
MD c:\dummy
:: go to root of tree containing SVN directories
PUSHD "%source%"
XCOPY /L /s . c:\dummy |find /i "\svn\" >"%temp%\svntmp1.tmp"
POPD
:: goto destination directory
PUSHD "%dest%"
FOR /f "delims=" %%i IN ('type "%temp%\svntmp1.tmp"') DO CALL :moveit "%%i"
FOR /f "delims=" %%i IN (
'TYPE "%temp%\svntmp2.tmp"^|sort /r'
) DO RD "%%i" /S /Q
POPD
:: delete tempfiles
del "%temp%\svntmp1.tmp"
del "%temp%\svntmp2.tmp"
:: delete the dummy directory
RD /s /q c:\dummy
GOTO :eof
:moveit
:: get filename, remove quotes, then remove leading '.'
SET sourcefile=%~1
SET sourcefile=%sourcefile:~1%
FOR %%i IN ("%sourcefile%") DO (
MD ".%%~pi" 2>nul
MOVE "%source%%%~i" ".%%~pnxi"
>>"%temp%\svntmp2.tmp" ECHO %source%%%~pi
)
GOTO :eof
- 设置源目录和目标目录。
- 创建一个虚拟的空目录
- 转到您的源并生成要移动的文件列表,
XCOPY/L
并过滤包含的行\svn\
- 转到您的目标目录
- 移动每个文件
- 删除前导 '.' 从
XCOPY
输出
- 创建目标子目录;忽略“它已经存在”错误
- 移动文件
- 在第二个临时文件中记录目录名称
- 对第二个临时文件进行反向排序,将最深的子目录放在首位
- 删除目录,忽略“它不存在”错误
- 删除临时文件和虚拟目录。
请注意,实际执行移动/目录创建/删除的命令只是ECHO
编辑。这样您就可以验证例程是否按照您的要求执行。您需要验证它是否正确,然后从语句中删除 ECHO 关键字以实际激活移动。为了安全起见,首先对一个小的虚拟区域进行测试。
至于恢复 - 它相对容易。
xcopy /s/e/v "...folder-b\dr1\svn\" "\folder-a\dr1\svn\"
应该做你想做的,将恢复的项目文件保存在文件夹-b 中(如果你喜欢删除 - 这是你的系统),你可以逐个项目地恢复。
(我一直在使用SVN
,因为现在这个点对我来说有点小了......)