找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 39570|回复: 9

[文件管理] 同步文件夹的批处理

[复制链接]
发表于 2010-8-9 19:10:57 | 显示全部楼层 |阅读模式
同步文件夹

  1. @goto start
  2. :help
  3. @echo.===== Ver: 1.0 ======== 同步文件夹 ======== 发布日期: 2010-08-09 =======
  4. @echo.        BAT_NAME:        synFolder.bat
  5. @echo.        返回值:                [%def_filename%]
  6. @echo.       
  7. @echo.        调用: synFolder.bat Folder1 [Folder2] [-s [size]] [-o [filename]] [-x]
  8. @echo.                Folder1 :        源文件夹
  9. @echo.                Folder2 :        目标文件夹,如不指定既为调用程序所在文件夹
  10. @echo.                -s [size]:        文件大于(size MB)被忽略;
  11. @echo.                                不选即不限定filesize;
  12. @echo.                                [size] 默认10,可不写. (0 ≤整数≤2147)
  13. @echo.                -o [filename]:        保存同步信息到文件(默认:返回值)
  14. @echo.                                不选即不记录文件copy的信息
  15. @echo.                -x :                双向同步,根据源文件夹的文件更新目标文件夹,
  16. @echo.                                两个文件夹都会改变;
  17. @echo.                                但是源文件夹没有的文件不会从目标文件夹copy.
  18. @echo.                -X                双向同步,两个文件夹完全相同;
  19. @echo.                        不选x^|X,单向同步,根据源文件夹里的文件更新目标文件夹,
  20. @echo.                                源文件夹不会变化;
  21. @echo.                -? :                查看帮助
  22. @echo.        注意:        0字节文件夹不会被建立.
  23. @echo.====================== Copyright@ by hf-g 2010-08-08 [彭城] ============
  24. ::ping /n 4 127.0>nul&
  25. goto:end
  26. ::==============================================================
  27. :start
  28. @echo off
  29. setlocal enabledelayedexpansion
  30. ::==============================================================
  31. set "def_filename=%temp%\ret_List.txt"
  32. ::echo "%1" & pause
  33. if /i "%~1"=="" goto help
  34. if /i "%~1"=="-?" goto help

  35. set "ret_filename="&set "file_Size="
  36. set /a size_BL=0,ret_BL=0,x_BL=20
  37. call:get_P %*
  38. if "%exit_BL%"=="1" goto end

  39. if "%desFolder%"=="" set "desFolder=%~dp0"
  40. if "%ret_BL%"=="1" (if "%ret_filename%"=="" set "ret_filename=%def_filename%")
  41. if "%size_BL%"=="1" (if "%file_Size%"=="" set "file_Size=10")
  42. echo %ret_BL%

  43. echo off
  44. echo 源文件夹:          %sorFolder%
  45. echo 目标文件夹:        %desFolder%
  46. echo 返回值:            %ret_filename%
  47. echo 文件限制:        ^<= %file_Size% MB
  48. if "%x_BL%"=="21" echo 双向同步:        -x 方式1
  49. if "%x_BL%"=="22" echo 双向同步:        -X 方式2
  50. if "%x_BL%"=="20" echo 单向同步:        源文件夹不会变化
  51. ::goto end
  52. ::--------------------------- main -------------------------------
  53. for /f "skip=4 delims=" %%a in ('reg query "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate') do (set "RegDateOld=%%a")
  54. set RegDateOld=%RegDateOld:~-8%
  55. reg add "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate /t REG_SZ /d yyyy-M-d /f>nul

  56. ::1MB=1024kB=1024*1024Byte=1048576Byte
  57. if "%size_BL%"=="1" (set /a file_Size=%file_Size% "*" 1048576)
  58. ::echo %RegDateOld:~-8%  %file_Size%

  59. ::大于等于指定%file_Size%的文件忽略. 同步为最新文件.
  60. call:get_fpath "%sorFolder%."
  61. set "sor_drive=%drive%"&set "sor_p_path=%p_path%"
  62. call:get_fpath "%desFolder%."
  63. set "des_drive=%drive%"&set "des_p_path=%p_path%"

  64. ::@echo on
  65. ::①
  66. (if "%ret_BL%"=="1" cd.>"%ret_filename%" 2>nul)&set/a count=0
  67. for /f "tokens=* delims=" %%a in ('dir /a-d/s/b "%sorFolder%."') do (
  68. if "%size_BL%"=="0" set /a file_Size=%%~za
  69. if %%~za LEQ !file_Size! (
  70. set "sorfile=%%a"
  71. set "sorfile=!sorfile:%%~da%sor_p_path%=!"
  72. for /f "tokens=* delims=" %%i in ("%desFolder%.\!sorfile!") do (
  73. if %%~ta GTR %%~ti (
  74. md "%%~dpi" 2>nul
  75. copy "%%~a" "%%~i">nul&&(set/a count+=1&set /p =!count!<nul&if "%ret_BL%"=="1" echo copyFile %%~a → %%~i>>"%ret_filename%")
  76. ) else (
  77.         if %x_BL% GTR 20 (
  78.         if %%~ti GTR %%~ta (
  79.                 md "%%~dpa" 2>nul
  80.                 copy "%%~i" "%%~a">nul&&(set/a count+=1&set /p =!count!<nul&if "%ret_BL%"=="1" echo copyFile %%~a ← %%~i>>"%ret_filename%")
  81.                 ))
  82. ))))
  83. @echo off
  84. ::②
  85. if %x_BL% == 22 (
  86. for /f "tokens=* delims=" %%a in ('dir /a-d/s/b "%desFolder%."') do (
  87. if %file_Size% GTR %%~za (
  88. set "desfile=%%a"
  89. set "desfile=!desfile:%%~da%des_p_path%=!"
  90. if not exist "%sorFolder%.\!desfile!" (
  91. call:get_fpath "%sorFolder%.\!desfile!"
  92. md "!drive!!p_path!" 2>nul
  93. copy "%%~a" "%sorFolder%.\!desfile!">nul&&(set/a count+=1&set /p =!count!<nul&if "%ret_BL%"=="1" echo copyFile %sorFolder%.\!desfile! ← %%~a>>"%ret_filename%")
  94. ))))

  95. if exist "%ret_filename%" (start notepad.exe "%ret_filename%"&ping/n 2 127.0>nul&del "%ret_filename%" 2>nul)

  96. ::----------------------------------------------------------------
  97. reg add "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate /t REG_SZ /d %RegDateOld% /f>nul
  98. :end
  99. ::echo ☆☆☆
  100. del tempfile.txt strHEX.txt>nul 2>nul
  101. exit /b
  102. ::====================================================
  103. :get_fpath [drive:path]
  104. set "drive=%~d1"
  105. set "p_path=%~p1"
  106. goto:eof
  107. ::====================================================
  108. ::========================参数设置与获得============================
  109. :get_p
  110. echo off
  111. ::调用:        call synFolder.bat Folder1 [Folder2] [-s [size]] [-o [filename]] [-x]
  112. set "sorFolder=%~1"&set /a count=1
  113. if not "%~2"=="" (
  114. set "_p=%~2"
  115. if not "!_p:~0,1!"=="-" (set "desFolder=%~2"&shift /1&set /a count+=1)
  116. ) else (
  117. goto get_p_end
  118. )

  119. :get_p1
  120. shift /1&set /a count+=1
  121. if not "%~1"=="" (
  122. set "_p=%~1"
  123. if not "!_p:~0,1!"=="-" echo 参数 !count! 错误.&set exit_BL=1&goto get_p_end
  124.         if /i "%~1"=="-s" (
  125.         set size_BL=1
  126.         if "%~2"=="" goto get_p_end
  127.         echo %~2|findstr "^[0-9][0-9]*$">nul&&(set "file_Size=%~2"&shift /1&set /a count+=1&goto get_p1)
  128.         ) else (
  129.                 if /i "%~1"=="-o" (
  130.                 set ret_BL=1
  131.                 if "%~2"=="" goto get_p_end
  132.                 if /i "%~2"=="-s" (if "!size_BL!"==1 (set "ret_filename=%~2"&shift /1&set /a count+=1&goto get_p1) else (goto get_p1))
  133.                 if "%~2"=="-x" (if "!x_BL!"==21 (set "ret_filename=%~2"&shift /1&set /a count+=1&goto get_p1) else (goto get_p1))
  134.                 if "%~2"=="-X" (if "!x_BL!"==22 (set "ret_filename=%~2"&shift /1&set /a count+=1&goto get_p1) else (goto get_p1))
  135.                 set "ret_filename=%~2"&shift /1&set /a count+=1&goto get_p1
  136.                 ) else (
  137.                         if "%~1"=="-x" (
  138.                         set x_BL=21
  139.                         ) else (
  140.                                 if "%~1"=="-X" (
  141.                                 set x_BL=22
  142.                                 ) else (
  143.                                         echo 参数 !count! 错误.&set exit_BL=1&goto get_p_end
  144.                                 )
  145.                         )
  146.                 )
  147.         )
  148. goto get_p1
  149. )



  150. :get_p_end
  151. goto:eof
复制代码
发表于 2010-8-10 15:11:06 | 显示全部楼层
=.= xcopy 能做大部分的工作了..
特别是是双向同步,还能分辨那边的文件比较新..
 楼主| 发表于 2010-8-10 18:02:16 | 显示全部楼层
如果不是xcopy 缺陷太多,我也懒得写这个P.
比如:
xcopy /d 命令, copy到目标文件夹后再用xcopy /d 它会copy回来,明明都一样又copy了一次.

也无法限定filesize.
发表于 2012-11-26 12:44:49 | 显示全部楼层
新手不太懂批处理的函数和语句,老师有说明吗
发表于 2012-11-26 23:55:58 | 显示全部楼层
回复 4# quartz123


    哪里有疑问可以提出来。如果基础比较欠缺的话,可以先找几个教程看看。
发表于 2013-9-17 10:23:19 | 显示全部楼层
这个怎么使用呀?点了什么反应都没,也不懂得哪里设定文件夹??
发表于 2013-9-17 10:23:36 | 显示全部楼层
回复 5# Batcher


    这个怎么使用呀?点了什么反应都没,也不懂得哪里设定文件夹??
发表于 2013-9-17 10:24:01 | 显示全部楼层
回复 1# hfg1977


    这个怎么使用呀?点了什么反应都没,也不懂得哪里设定文件夹??
发表于 2013-9-18 20:02:52 | 显示全部楼层
研究一下!看似很复杂。
发表于 2014-6-9 01:01:40 | 显示全部楼层
几年了......不过还是简单把楼主代码研究加测试了下

发现楼主的代码有点问题:
1.从注册表读取原本日期格式失败,导致运行后日期格式混乱  【已修改】
2.记录文档被意外删除,应该是删掉临时目录下的那个    【已修改】
3.【缺陷】 文件名被修改后帮助文档的文件名不准确      【已修改】
4.简单修改帮助文档(发现有些人不会用)
另外个人觉得:处理完成可以不自动弹出记录,不过我没有修改

另外:直接调用:xxx.bat [参数] 会导致整个(包括父窗口)退出,使用call命令活着cmd /c 即可正常。
  1. @goto start
  2. :help
  3. @echo.===== Ver: 2.0 ======== 同步文件夹 ======== 发布日期: 2014-06-09 =======
  4. @echo.        BAT_NAME:        %0
  5. @echo.        返回值:                [%def_filename%]
  6. @echo.       
  7. @echo.        调用方法(从别处调用):
  8. @echo.  call %0 Folder1 [Folder2] [-s [size]] [-o [filename]] [-x^|X]
  9. @echo.                Folder1 :        源文件夹
  10. @echo.                Folder2 :        目标文件夹,如不指定既为调用程序所在文件夹
  11. @echo.                -s [size]:        文件大于(size MB)被忽略;
  12. @echo.                                不选即不限定filesize;
  13. @echo.                                [size] 默认10,可不写. (0 ≤整数≤2147)
  14. @echo.                -o [filename]:        保存同步信息到文件(默认:返回值)
  15. @echo.                                不选即不记录文件copy的信息
  16. @echo.                -x :                双向同步,根据源文件夹的文件更新目标文件夹,
  17. @echo.                                两个文件夹都会改变;
  18. @echo.                                但是源文件夹没有的文件不会从目标文件夹copy.
  19. @echo.                -X                双向同步,两个文件夹完全相同;
  20. @echo.                        不选x^|X,单向同步,根据源文件夹里的文件更新目标文件夹,
  21. @echo.                                源文件夹不会变化;
  22. @echo.                -? :                查看帮助
  23. @echo.        注意:        0字节文件夹不会被建立.
  24. @echo.====================== Copyright@ by hf-g 2010-08-08 [彭城] ============
  25. @echo.====================== Edit by Tamce 2014-06-09 [Tamce.Joe] ============

  26. ::ping /n 4 127.0>nul&
  27. goto:end
  28. ::==============================================================
  29. :start
  30. @echo off
  31. setlocal enabledelayedexpansion
  32. ::==============================================================
  33. set "def_filename=%temp%\ret_List.txt"
  34. ::echo "%1" & pause
  35. if /i "%~1"=="" goto help
  36. if /i "%~1"=="-?" goto help

  37. set "ret_filename="&set "file_Size="
  38. set /a size_BL=0,ret_BL=0,x_BL=20
  39. call:get_P %*
  40. if "%exit_BL%"=="1" goto end

  41. if "%desFolder%"=="" set "desFolder=%~dp0"
  42. if "%ret_BL%"=="1" (if "%ret_filename%"=="" set "ret_filename=%def_filename%")
  43. if "%size_BL%"=="1" (if "%file_Size%"=="" set "file_Size=10")
  44. echo %ret_BL%

  45. echo off
  46. echo 源文件夹:          %sorFolder%
  47. echo 目标文件夹:        %desFolder%
  48. echo 返回值:            %ret_filename%
  49. echo 文件限制:        ^<= %file_Size% MB
  50. if "%x_BL%"=="21" echo 双向同步:        -x 方式1
  51. if "%x_BL%"=="22" echo 双向同步:        -X 方式2
  52. if "%x_BL%"=="20" echo 单向同步:        源文件夹不会变化
  53. ::goto end
  54. ::--------------------------- main -------------------------------

  55. for /f "eol=; skip=2 tokens=3 delims= " %%a in ('reg query "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate') do (set "RegDateOld=%%a")
  56. ::echo %RegDateOld%

  57. ::set RegDateOld=%RegDateOld:~-8%
  58. reg add "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate /t REG_SZ /d yyyy-M-d /f >nul
  59. ::1MB=1024kB=1024*1024Byte=1048576Byte
  60. if "%size_BL%"=="1" (set /a file_Size=%file_Size% "*" 1048576)
  61. ::echo %RegDateOld:~-8%  %file_Size%

  62. ::大于等于指定%file_Size%的文件忽略. 同步为最新文件.
  63. call:get_fpath "%sorFolder%."
  64. set "sor_drive=%drive%"&set "sor_p_path=%p_path%"
  65. call:get_fpath "%desFolder%."
  66. set "des_drive=%drive%"&set "des_p_path=%p_path%"

  67. ::@echo on
  68. ::①
  69. (if "%ret_BL%"=="1" cd.>"%ret_filename%" 2>nul)&set/a count=0
  70. for /f "tokens=* delims=" %%a in ('dir /a-d/s/b "%sorFolder%."') do (
  71. if "%size_BL%"=="0" set /a file_Size=%%~za
  72. if %%~za LEQ !file_Size! (
  73. set "sorfile=%%a"
  74. set "sorfile=!sorfile:%%~da%sor_p_path%=!"
  75. for /f "tokens=* delims=" %%i in ("%desFolder%.\!sorfile!") do (
  76. if %%~ta GTR %%~ti (
  77. md "%%~dpi" 2>nul
  78. copy "%%~a" "%%~i">nul&&(set/a count+=1&set /p =!count!<nul&if "%ret_BL%"=="1" echo copyFile %%~a → %%~i>>"%ret_filename%")
  79. ) else (
  80.         if %x_BL% GTR 20 (
  81.         if %%~ti GTR %%~ta (
  82.                 md "%%~dpa" 2>nul
  83.                 copy "%%~i" "%%~a">nul&&(set/a count+=1&set /p =!count!<nul&if "%ret_BL%"=="1" echo copyFile %%~a ← %%~i>>"%ret_filename%")
  84.                 ))
  85. ))))
  86. @echo off
  87. ::②
  88. if %x_BL% == 22 (
  89. for /f "tokens=* delims=" %%a in ('dir /a-d/s/b "%desFolder%."') do (
  90. if %file_Size% GTR %%~za (
  91. set "desfile=%%a"
  92. set "desfile=!desfile:%%~da%des_p_path%=!"
  93. if not exist "%sorFolder%.\!desfile!" (
  94. call:get_fpath "%sorFolder%.\!desfile!"
  95. md "!drive!!p_path!" 2>nul
  96. copy "%%~a" "%sorFolder%.\!desfile!">nul&&(set/a count+=1&set /p =!count!<nul&if "%ret_BL%"=="1" echo copyFile %sorFolder%.\!desfile! ← %%~a>>"%ret_filename%")
  97. ))))

  98. if exist "%ret_filename%" (start notepad.exe "%ret_filename%")
  99. del "%def_filename%" 2>nul

  100. ::----------------------------------------------------------------
  101. reg add "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate /t REG_SZ /d %RegDateOld% /f >nul
  102. :end
  103. ::echo ☆☆☆
  104. del tempfile.txt strHEX.txt>nul 2>nul
  105. exit /b
  106. ::====================================================
  107. :get_fpath [drive:path]
  108. set "drive=%~d1"
  109. set "p_path=%~p1"
  110. goto:eof
  111. ::====================================================
  112. ::========================参数设置与获得============================
  113. :get_p
  114. echo off
  115. ::调用:        call synFolder.bat Folder1 [Folder2] [-s [size]] [-o [filename]] [-x]
  116. set "sorFolder=%~1"&set /a count=1
  117. if not "%~2"=="" (
  118. set "_p=%~2"
  119. if not "!_p:~0,1!"=="-" (set "desFolder=%~2"&shift /1&set /a count+=1)
  120. ) else (
  121. goto get_p_end
  122. )

  123. :get_p1
  124. shift /1&set /a count+=1
  125. if not "%~1"=="" (
  126. set "_p=%~1"
  127. if not "!_p:~0,1!"=="-" echo 参数 !count! 错误.&set exit_BL=1&goto get_p_end
  128.         if /i "%~1"=="-s" (
  129.         set size_BL=1
  130.         if "%~2"=="" goto get_p_end
  131.         echo %~2|findstr "^[0-9][0-9]*$">nul&&(set "file_Size=%~2"&shift /1&set /a count+=1&goto get_p1)
  132.         ) else (
  133.                 if /i "%~1"=="-o" (
  134.                 set ret_BL=1
  135.                 if "%~2"=="" goto get_p_end
  136.                 if /i "%~2"=="-s" (if "!size_BL!"==1 (set "ret_filename=%~2"&shift /1&set /a count+=1&goto get_p1) else (goto get_p1))
  137.                 if "%~2"=="-x" (if "!x_BL!"==21 (set "ret_filename=%~2"&shift /1&set /a count+=1&goto get_p1) else (goto get_p1))
  138.                 if "%~2"=="-X" (if "!x_BL!"==22 (set "ret_filename=%~2"&shift /1&set /a count+=1&goto get_p1) else (goto get_p1))
  139.                 set "ret_filename=%~2"&shift /1&set /a count+=1&goto get_p1
  140.                 ) else (
  141.                         if "%~1"=="-x" (
  142.                         set x_BL=21
  143.                         ) else (
  144.                                 if "%~1"=="-X" (
  145.                                 set x_BL=22
  146.                                 ) else (
  147.                                         echo 参数 !count! 错误.&set exit_BL=1&goto get_p_end
  148.                                 )
  149.                         )
  150.                 )
  151.         )
  152. goto get_p1
  153. )



  154. :get_p_end
  155. goto:eof
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-16 20:18 , Processed in 0.022233 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表