[20170425]实现磁盘文件与U盘同步.txt
--//工作需要实现磁盘文件与U盘同步,也就是每天下班前拷贝磁盘文件到U盘,而回到家再需要U盘文件拷贝到本地磁盘,如此反复。
--//随着文件越来越多,里面都是很小的文本文件,每次拷贝非常浪费时间,从以前几分钟到现在将近1X分钟,越来越慢。
--//我以前的脚本核心内容大致如下:
--// 说明 U:表示U盘, H:
--//in.bat U盘到本地磁盘
xcopy /d/e/y U:\blog\*.* h:\blog
--//out.bat 本地磁盘到U盘
xcopy /d/e/y h:\blog\*.* U:\blog\*.*
--//实际上这样仅仅修改更新的文件才覆盖,真正拷贝的文件不是很多,随着里面文件增加,磁盘与U盘对比浪费许多时间,越来越慢。
--//于是开始考虑别的解决方法:
--//许多站点提到了robocopy,我看了一下不是很合适。
--//找到如下链接:
blog.csdn.net/kk185800961/article/details/42194327
--//不过竟然使用xcopy /EXCLUDE的排他模式,显然这样不是很科学,正常选择拷贝文件就OK了。
--//里面提到了无法使用+在forfiles。实际上+支持日期模式:
R:\>forfiles /?
...
示例:
FORFILES /?
FORFILES
FORFILES /P C:\WINDOWS /S /M DNS*.*
FORFILES /S /M *.txt /C "cmd /c type @file | more"
FORFILES /P C:\ /S /M *.bat
FORFILES /D -30 /M *.exe
/C "cmd /c echo @path 0x09 在 30 前就被更改。"
FORFILES /D 2001/01/01
/C "cmd /c echo @fname 在 2001年1月1日就是新的。"
FORFILES /D +2017/4/25 /C "cmd /c echo @fname 今天是新的。"
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
FORFILES /M *.exe /D +1
FORFILES /S /M *.doc /C "cmd /c echo @fsize"
FORFILES /M *.txt /C "cmd /c if @isdir==FALSE notepad.exe @file"
--//注意看下划线以及日期格式。
--//有了这些知识,就有了前面2篇blog,windows批处理脚本真麻烦。
http://blog.itpub.net/267265/viewspace-2137952/
http://blog.itpub.net/267265/viewspace-2137957/
--//inx.bat U盘到本地磁盘
echo @echo on > d:\usb.bat
sleep 1
echo echo start sync file from usb >> d:\usb.bat
sleep 1
echo h: >> d:\usb.bat
sleep 1
echo cd \blog >> d:\usb.bat
sleep 1
echo D:\tools\linux\usr\local\wbin\date "+%%%%T" >> d:\usb.bat
rem xcopy /d/e/y *.* h:\blog\*.*
forfiles /p "U:\blog" /m * /s /d +2017/04/24 /c "cmd /c if @isdir==FALSE echo echo F ^| xcopy /d/e/y @path @relpath" >> d:\usb.bat
rem forfiles /p "o:\blog" /m * /s /d +%date:~0,10% /c "cmd /c if @isdir==FALSE echo echo F ^| xcopy /d/e/y @path @relpath" >> d:\usb.bat
sleep 1
echo D:\tools\linux\usr\local\wbin\date "+%%%%T" >> d:\usb.bat
sleep 1
echo echo end sync >> d:\usb.bat
sleep 1
echo pause >> d:\usb.bat
pause
call d:\usb.bat
--//生成xcopy命令前加入管道,是因为如果是新文件目的地没有windows会提示是目录还是文件,正常选择F,于是前面有了echo F。
--//另外为了输出| ,前面必须加一个转义符号^.昏,微软的批处理脚本语言真混乱。
--//如果输出到文件usb.bat的时间不适合可以自己改,我不想再写了。
--//outx.bat 本地磁盘到U盘
echo @echo on > d:\usb.bat
sleep 1
echo echo start sync file to usb >> d:\usb.bat
sleep 1
echo U: >> d:\usb.bat
sleep 1
echo cd \blog >> d:\usb.bat
sleep 1
echo D:\tools\linux\usr\local\wbin\date "+%%%%T" >> d:\usb.bat
rem xcopy /d/e/y *.* h:\blog\*.*
sleep 1
forfiles /p "h:\blog" /m * /s /d +%date:~0,10% /c "cmd /c if @isdir==FALSE echo echo F ^| xcopy /d/e/y @path @relpath" >> d:\usb.bat
sleep 1
echo D:\tools\linux\usr\local\wbin\date "+%%%%T" >> d:\usb.bat
sleep 1
echo echo end sync >> d:\usb.bat
sleep 1
echo pause >> d:\usb.bat
pause
call d:\usb.bat
--//这样U盘拷贝到磁盘稍微慢一点,基本也在3-4分钟解决问题。磁盘到U盘很快,基本1-2分钟。
--//还有一些疑问windows脚本如何获取前一天的日期,不知道如何实现替换+%date:~0,10%
--//linux下可以使用
$ date --date='1 days ago' "+%Y/%m/%d"
2017/04/24
--//linux bash shell可以通过变量写入,而windows批处理如何把命令的结果传递给变量呢?我想到仅仅是先将命令结果保存到文件,
--//在通过文件传递给变量。 不熟悉windows放弃!!
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/267265/viewspace-2137969/ ,如需转载,请注明出处,否则将追究法律责任。