Board logo

标题: [文件操作] [已解决]求批处理自动整理桌面文件并以日期归档 望大侠指点 [打印本页]

作者: erjnasrtnws    时间: 2015-11-21 16:38     标题: [已解决]求批处理自动整理桌面文件并以日期归档 望大侠指点

把今天--桌面---上的(新建文件 或者 下载的或者粘贴复制过来的文件)无论任何类型的文件归档到归档文件夹下以日期命名(按日期年月日如20150101)的文件夹里面,只处理今天的,之前(前天明天)之后的文件都不需要要处理,补充 桌面上的快捷方式也不要删除 谢谢
求批处理脚本, 望大侠指点
最终效果是  桌面上 只有我的电脑 回收站 归档 (在归档里有20150101 20150102 20150102.。。。。。)  和 不是今天的文件,还有一些快捷方式。不知道我说明白了没有


望各位坛友不吝赐教!!!


1 补充如果假如归档之日期命名的文件夹中已有相同文件,请教如何不要覆盖,相同文件归档之后变成   名称-1  ,名称-2 ,名称-3 这样形式的

2 还有一种情况可能难处理 就是剪切到桌面上的文件,它还是以前的日期 请问是否有方法把剪切过来的文件也归档到以今天日期命名的文件夹之中了(如无法解决 可以不管剪切到桌面上的文件)
作者: 依山居    时间: 2015-11-21 21:04

本帖最后由 依山居 于 2015-11-21 21:05 编辑

没能力自己学就乖乖自己下个备份软件去。
Cobian Backup 免费开源,相当专业的文件备份软件。用过有好感。
作者: ygqiang    时间: 2015-11-21 22:13

回复 1# erjnasrtnws
  1. @echo off & color 0d
  2. for /f "tokens=2,*" %%i in ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Desktop"') do (
  3. set "desktop_dir=%%j"
  4. )
  5. ——————————————————————————————————————————————
  6. set "back_dir=d:\桌面备份\%date:~0,4%-%date:~5,2%桌面备份"
  7. set "back_dir1=%date:~0,4%-%date:~5,2%桌面备份"
  8. set "back_dir_favo=d:\桌面备份\%date:~0,4%-%date:~5,2%桌面备份\收藏夹"
  9. if not exist "d:\桌面备份" (md "d:\桌面备份")
  10. if not exist "%back_dir%" (md "%back_dir%")
  11. if not exist "%back_dir_favo%" (md "%back_dir_favo%")
  12. 1set "filesdate=%date:~0,4%%date:~5,2%%date:~8,2%"
  13. ——————————————————————————————————————————————
  14. robocopy "%desktop_dir%" "%back_dir%" /move /e /xf *.lnk
  15. robocopy "%userprofile%\Favorites" "d:\00beifen\备份\7Favorites" /mir /w:2 /r:2
  16. robocopy "%userprofile%\Favorites" "%back_dir_favo%" /mir /w:2 /r:2
  17. ——————————————————————————————————————————————
  18. for /f "delims=" %%a in ('dir /a-d /b /s "%desktop_dir%\*.*"') do (
  19. if "%%~xa" neq ".lnk" (del "%%a" /f /s /q)
  20. )
  21. for /f "delims=" %%b in ('dir /ad /b /s "%desktop_dir%\"^|sort /r') do (rd "%%b" /s /q)
  22. ——————————————————————————————————————————————
  23. (echo Set objShell=CreateObject^("WScript.Shell"^)
  24. echo DesktopPath=objShell.SpecialFolders^("Desktop"^)
  25. echo Set objlink=objShell.CreateShortcut^(DesktopPath ^& "\%back_dir1%.lnk"^)
  26. echo objlink.Hotkey="CTRL+Q"
  27. echo objlink.WindowStyle=3
  28. echo objlink.TargetPath="%back_dir%"
  29. echo objlink.Save
  30. )>"%temp%\mysendto.vbs"
  31. start /wait "" "%temp%\mysendto.vbs"
  32. cls
  33. ping 127.0.0.1 -n 5 >nul 2>nul
  34. del /q "%temp%\mysendto.vbs"
  35. ——————————————————————————————————————————————
  36. title 重启explorer资源管理器不关闭打开的文件夹
  37. 1set/p "p=即将重启 Explorer,"<nul & 1pause
  38. Call :_RestartExplorer
  39. echo 完成!
  40. 1pause
  41. cls
  42. ping 127.0.0.1 -n 5 >nul 2>nul
  43. start "" "%back_dir%"
  44. exit
  45. :: 重启 Explorer
  46. goto :eof
  47. :_RestartExplorer
  48.   ( echo Set objWsh = CreateObject^("WScript.Shell"^)
  49.   echo Set objShell = CreateObject^("Shell.Application"^)
  50.   echo For Each objWin In objShell.Windows
  51.   echo   If Instr^(LCase^(objWin.FullName^),"\explorer.exe"^) Then
  52.   echo     strURL = strURL ^& objWin.LocationURL ^& vbCrLf
  53.   echo   End If
  54.   echo Next
  55.   echo If strURL = "" Then WScript.Quit
  56.   echo strURL = Left^(strURL, Len^(strURL^)-Len^(vbCrLf^)^)
  57.   echo arrURL = Split^(strURL, vbCrLf^)
  58.   echo objWsh.run "cmd /c taskkill /f /im explorer.exe & start """" explorer", 0, True
  59.   echo For Each strURL In arrURL
  60.   echo   objShell.Explore strURL
  61.   echo Next )>"%temp%\RestartExplorer.vbs"
  62.   CScript //NoLogo "%temp%\RestartExplorer.vbs"
  63.   del /q /f "%temp%\RestartExplorer.vbs"
  64.   goto :eof
复制代码

作者: ygqiang    时间: 2015-11-21 22:14

回复 1# erjnasrtnws


robocopy.exe自己网上下载。。。
作者: 依山居    时间: 2015-11-21 23:39

本帖最后由 依山居 于 2015-11-21 23:41 编辑

回复 4# ygqiang


取当前用户桌面路径,从当前用户变量中取,代码量应该更加少。%HOMEPATH%\desktop 这样就行了。
  1. o( ̄▽ ̄)o 2015/11/21 周六23:40:29.02 <( ̄︶ ̄)>
  2. c:\>cd %HOMEPATH%\desktop
  3. o( ̄▽ ̄)o 2015/11/21 周六23:40:31.45 <( ̄︶ ̄)>
  4. c:\Users\xxx\Desktop>
复制代码

作者: terse    时间: 2015-11-22 00:24

本帖最后由 terse 于 2015-11-25 11:17 编辑
  1. @if(0)==(0) echo off & CScript -NoLogo -E:JScript %0 & exit @end
  2. Date.prototype.Format = function (fmt) {
  3.     var o = {
  4.         "M+": this.getMonth() + 1,
  5.         "d+": this.getDate()
  6.     };
  7.     if (/(y+)/.test(fmt))
  8.         fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
  9.     for (var k in o)
  10.         if (new RegExp("(" + k + ")").test(fmt))
  11.             fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
  12.     return fmt;
  13. }
  14. var Shell = WScript.CreateObject("WScript.Shell");
  15. var fso = WScript.CreateObject("Scripting.FileSystemObject");
  16. var strDesktop = Shell.SpecialFolders("Desktop");
  17. var ff = strDesktop + "\\归档\\" + new Date().Format("yyyyMMdd");
  18. if(!fso.FolderExists(ff)){
  19.    fso.CreateFolder(ff);
  20. };
  21. var d = new Date();
  22. var Folder= fso.GetFolder(strDesktop);
  23. for(var e=new Enumerator(Folder.Files);!e.atEnd();e.moveNext()){
  24.    var f=e.item();
  25.    var t = parseInt(Math.round(d - f.Datecreated)/86400000);
  26.    if (t == 0) {
  27.     f.Move(ff+ "\\" + f.name);
  28.    }
  29. }
复制代码

作者: ygqiang    时间: 2015-11-22 12:28

回复 5# 依山居


    你这个代码,xp/win7系统不通用吧?
作者: 依山居    时间: 2015-11-22 12:37

回复 7# ygqiang


    开虚拟机验证了一下。有这个变量。确实不兼容,路径名是中文也就是cd %homepath%\桌面

win 7 是%homepath%\desktop
作者: 依山居    时间: 2015-11-22 12:56

测试了一下可以这样写。
  1. cd /d "%USERPROFILE%\desktop"|| cd /d "%USERPROFILE%\桌面"
复制代码

作者: erjnasrtnws    时间: 2015-11-23 08:21

再次谢谢3楼 6楼的热心指点
作者: erjnasrtnws    时间: 2015-11-25 10:12

回复 3# ygqiang
大侠请问,你的代码XP可以使用吗?我在XP中使用发现桌面的文件的确没有了呵呵 这效果很好 正好想把快捷方式留在z桌面 可是在D盘的桌面备份文件夹里也是空的,不知道文件到哪里去了 !代码运行时,显示删除快捷方式错误《不知道是否对运行最终结果产生影响了???本人希望保留快捷方式不删除
求大侠指点
作者: erjnasrtnws    时间: 2015-11-25 10:16

回复 6# terse
大侠你的代码无反应l!!!我在XP中运行的 需要注意些什么了??
作者: terse    时间: 2015-11-25 11:17

回复 12# erjnasrtnws
已修改 代码第一行 echo off 后面 加个 &
  1. echo off & CScript...........
复制代码

作者: WHY    时间: 2015-11-25 13:31

本帖最后由 WHY 于 2015-11-25 13:41 编辑
  1. @echo off
  2. set "s=HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"
  3. for /f "tokens=2*" %%i in ('reg query "%s%" /v Desktop') do (
  4.     set "Desktop=%%j"
  5. )
  6. for /f %%i in ('wmic os get LocalDateTime^|findstr /b [0-9]') do (
  7.     set "Today=%%i"
  8. )
  9. set "Today=%Today:~0,8%"
  10. md "%Desktop%\归档\%Today%\" 2>nul
  11. set "MyPath=%Desktop:~2%\"
  12. set wql=where "drive='%Desktop:~0,2%' and path='%MyPath:\=\\%'"
  13. for /f "tokens=1*" %%i in ('wmic datafile %wql% get creationdate^,name^|findstr /b %Today%')do (
  14.     for /f "delims=" %%j in ("%%j") do (
  15.         if /i not "%%~fj" == "%~f0" move "%%~fj" "%Desktop%\归档\%Today%\"
  16.     )
  17. )
  18. pause
复制代码

作者: erjnasrtnws    时间: 2015-11-25 14:02

本帖最后由 erjnasrtnws 于 2015-11-25 14:14 编辑

回复 14# WHY

谢谢  刚刚试了效果很好
望大侠改进!!!!!
1请问如何保留桌面的快捷方式了??? 希望把快捷方式图标留在桌面上,求指点
2,如何实现和3楼一样的效果,就是把不是今天新建的文件(是从其它盘拷贝到桌面上的不是今天的文件)也可以放入归档之中

如能实现那就对我来说相当完美了,我会终身珍藏的

本人能力低微,望大侠不吝赐教!!!!谢谢
作者: WHY    时间: 2015-11-25 14:13

回复 15# erjnasrtnws


    把14行改成
  1. set wql=where "drive='%Desktop:~0,2%' and path='%MyPath:\=\\%' and extension!='LNK'"
复制代码

作者: erjnasrtnws    时间: 2015-11-25 14:32

本帖最后由 erjnasrtnws 于 2015-11-26 13:44 编辑

回复 16# WHY

很好!!! 谢谢
只差一步就完美了  可否试下?? 呵呵

补充更正 ----   实现和3楼差不多的效果,就是把不是今天新建的文件(是从其它盘拷贝到桌面上的不是今天的文件)也可以放入归档到(以今天的日期命名的文件夹)之中
作者: WHY    时间: 2015-11-25 18:51

回复 17# erjnasrtnws


    顶楼并没有这种要求啊,3楼的代码我没有试,以下代码不知道是不是你想要的:
  1. @echo off
  2. set "s=HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"
  3. for /f "tokens=2*" %%i in ('reg query "%s%" /v Desktop') do (
  4.     set "Desktop=%%j"
  5. )
  6. set "MyPath=%Desktop:~2%\"
  7. set wql=where "drive='%Desktop:~0,2%' and path='%MyPath:\=\\%' and extension!='LNK'"
  8. (for /f "tokens=1*" %%i in ('wmic datafile %wql% get creationdate^,name^|find "\"') do (
  9.     set "D=%%i"
  10.     setlocal enabledelayedexpansion
  11.     for %%k in ("%Desktop%\归档\!D:~0,8!") do (
  12.         endlocal
  13.         for /f "delims=" %%j in ("%%j") do (
  14.             if /i not "%%~fj" == "%~f0" (
  15.                 md "%%~k\"
  16.                 move "%%~fj" "%%~k\"
  17.             )
  18.         )
  19.     )
  20. )) 2>nul
复制代码

作者: ygqiang    时间: 2015-11-25 23:25

回复  ygqiang
大侠请问,你的代码XP可以使用吗?我在XP中使用发现桌面的文件的确没有了呵呵 这效果很好  ...
erjnasrtnws 发表于 2015-11-25 10:12



    xp/win7 64系统都测试过。。。除了快捷方式不改动。。。
其他都正常。。。
作者: erjnasrtnws    时间: 2015-11-26 07:43

回复 18# WHY

厉害啊 您的代码这么简洁啊 呵呵
达到了我想要的效果了 好像有点小问题 日期不对一下子生成两个日期  你看下图片 我刚刚测试的


希望大侠改进一下
补充 大侠可以保留昨天 和之前的文件不动吗 ??我只想归档当天的文件可以吗!!麻烦了
作者: erjnasrtnws    时间: 2015-11-26 07:49

回复 19# ygqiang


OK  谢谢回复  可能我电脑有些问题  装的精简版XP的  我有空去其他电脑试下
作者: WHY    时间: 2015-11-26 11:17

回复 20# erjnasrtnws


    14楼的意思是,把桌面上今天(2015/11/26)创建的文件移动到 桌面\归档\20151126 文件夹中,这也是你在顶楼要求的

18楼的意思是,把桌面上除LNK快捷方式和批处理自身以外的文件移动到“桌面\归档\以文件创建日期命名”的文件夹中。之所以出现两个以日期命名的文件夹,是因为有两种不同日期创建的文件
作者: erjnasrtnws    时间: 2015-11-26 11:22

本帖最后由 erjnasrtnws 于 2015-11-26 11:29 编辑

回复 22# WHY


哦  不好意思 大侠看的如此仔细 !谢谢了  我一定认真修改下!
作者: erjnasrtnws    时间: 2015-11-26 13:46

本帖最后由 erjnasrtnws 于 2015-11-26 13:50 编辑

回复 22# WHY

谢谢大侠指正 不好意思啊  表达不准确我已更正
作者: erjnasrtnws    时间: 2015-11-26 14:03

本帖最后由 erjnasrtnws 于 2015-11-26 14:05 编辑

回复 16# WHY


    请问大侠 如果有相同文件就直接覆盖了,请教如何不要覆盖,直接变成   名称-1  名称-2 这样形式的  
大侠有空的话   帮忙在看看吧 谢谢了 !!!
作者: erjnasrtnws    时间: 2015-11-28 16:51

谢谢热心的各位大侠 问题已经解决很好了 虽然离完美只差一步 已经非常满意了 !!!对帮我解答的大侠,再次衷心说声谢谢了,好人一生平安!!!!
作者: ygqiang    时间: 2016-1-9 11:00

回复 26# erjnasrtnws


    最终代码是啥?都需要用到哪些exe文件?
作者: erjnasrtnws    时间: 2016-1-9 13:32

本帖最后由 erjnasrtnws 于 2016-1-9 13:41 编辑

回复 27# ygqiang
  1. @echo off
  2. set "s=HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"
  3. for /f "tokens=2*" %%i in ('reg query "%s%" /v Desktop') do (
  4.     set "Desktop=%%j"
  5. )
  6. for /f %%i in ('wmic os get LocalDateTime^|findstr /b [0-9]') do (
  7.     set "Today=%%i"
  8. )
  9. set "Today=%Today:~0,8%"
  10. md "%Desktop%\归档\%Today%\" 2>nul
  11. set "MyPath=%Desktop:~2%\"
  12. set wql=where "drive='%Desktop:~0,2%' and path='%MyPath:\=\\%' and extension!='LNK'"
  13. for /f "tokens=1*" %%i in ('wmic datafile %wql% get creationdate^,name^|findstr /b %Today%')do (
  14.     for /f "delims=" %%j in ("%%j") do (
  15.         if /i not "%%~fj" == "%~f0" move "%%~fj" "%Desktop%\归档\%Today%\"
  16.     )
  17. )
  18. pause
复制代码
我现在就用的这个 感觉横好  不需要EXE的
你可以试试 只处理桌面上的今天产生的文件  在桌面上已日期归档 (是移动文件不是复制)




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2