Board logo

标题: [文件操作] [已解决]批处理如何查找出最近一个修改的文件夹? [打印本页]

作者: q120072949    时间: 2010-9-25 11:54     标题: [已解决]批处理如何查找出最近一个修改的文件夹?

在百度找到的一般都是查找今天或者最近3天内修改过的文件或者文件夹
无奈自己代码水平有限,我想达到的效果是查找出最后一个修改的文件夹,这样就涉及到了对比
比如D:\bak文件夹下有若干个文件夹:
D:\bak\sql_1_0_0_45
D:\bak\sql_1_0_0_46
D:\bak\sql_1_0_0_47
D:\bak\db0612
D:\bak\4540db
............
得到最后一个修改的文件夹并打开它
名字可能是没有规律的,修改时间可能随时在变化,比如现在获取到的是第一个文件夹,过10分钟可能是另一个了

我想批处理得到修改时间离现在最近的文件夹,这样的话需要先获取现在时间,然后挨个文件夹的修改时间去对比
感觉算法比较庞大,我写不出来
希望老鸟高手帮忙解答,谢谢!

[ 本帖最后由 q120072949 于 2010-12-15 15:43 编辑 ]
作者: Batcher    时间: 2010-9-25 12:29

  1. @echo off
  2. for /f "delims=" %%a in ('dir /b /ad /od "C:\test"') do (
  3.     set "folder=%%~fa"
  4. )
  5. start explorer "%folder%"
复制代码

作者: q120072949    时间: 2010-9-25 13:19

Batcher管理就是厉害啊!
代码第二行加上cd /d C:\test效果更理想,这样批处理可以在任意地方运行了,不然只能在C:\test目录下运行
可有个新的问题出现了,比如这个路径是另外一台机器的共享路径,比如:
\\192.168.1.100\Application Files

这样的话我运行就报错,虽然我加了双引号:
CMD does not support UNC paths as current directories.
Press any key to continue . . .

意思是:不支持当前目录的UNC路径。

对于这类共享并且是只读没有修改权限的路径,批处理要怎么优化??纠结ing
作者: Batcher    时间: 2010-9-25 13:35     标题: 回复 3楼 的帖子

用net use命令把它映射为本地磁盘试试
作者: q120072949    时间: 2010-9-25 17:21

  1. @echo off
  2. net use * /del /y
  3. net use H: "\\192.168.1.100\Application Files"
  4. cd /d h:
  5. for /f "delims=" %%a in ('dir /b /ad /od "H:"') do (
  6.     set "folder=%%~fa"
  7. )
  8. ::start explorer "%folder%"
  9. echo "%folder%"
  10. cd /d "%folder%"
  11. set "cd_=%cd%"
  12. :loop
  13. set "cd_=%cd_:*\=%"
  14. set "cd_tmp=%cd_:\=%"
  15. if not "%cd_tmp%"=="%cd_%" goto loop
  16. echo "%cd_%"
  17. rd /q /s "c:\%cd_%"
  18. rem 防止文件夹名字跟上次重复
  19. md "c:\%cd_%"
  20. xcopy /f /s /e /y "%folder%" "c:\%cd_%"
  21. echo c:\%cd_%>c:\已复制文件夹名字.txt
  22. echo @echo off>c:\abc.bat
  23. echo net use * /del /y>>c:\abc.bat
  24. echo del %0/f>>c:\abc.bat
  25. start c:\
复制代码
代码七七八八的差不多了,还有最后一步实现不了,就是断开映射
如果直接在复制文件夹代码最后加上"net use * /del /y",会提示你正在使用,无法删除映射
所以必须等这个批处理走完,手动再执行abc.bat去删除映射
不知道能否解决??
作者: Batcher    时间: 2010-9-25 22:10     标题: 回复 5楼 的帖子

在xcopy下面加个延时试试
作者: q120072949    时间: 2010-9-26 17:48

我加了10秒延迟(实际只有9秒),貌似不行
ping 127.1 -n 10 >Nul
作者: ycy8357    时间: 2010-9-28 17:22

精彩,厉害.帅呆,字节够了吧
作者: powerbat    时间: 2010-9-28 19:12     标题: 回复 5楼 的帖子

因为你的cmd当前工作在h:,正在使用,当然无法删除

记得某前辈说过,bat对路径有依赖时,最好在依赖部分的开始和结束分别加入pushd  "目标路径"和popd,这一定律在此处发扬光大!
作者: Batcher    时间: 2010-9-28 20:59     标题: 回复 7楼 的帖子

照9楼说的,xcopy之后cd到C:\,再删除试试。
作者: q120072949    时间: 2010-9-30 08:19

  1. @echo off
  2. net use * /del /y
  3. ::注意:上面第二行代码是删除所有映射,谨慎使用!
  4. net use H: "\\192.168.1.100\Application Files"
  5. cd /d h:
  6. for /f "delims=" %%a in ('dir /b /ad /od "H:"') do (
  7.     set "folder=%%~fa"
  8. )
  9. ::start explorer "%folder%"
  10. echo "%folder%"
  11. cd /d "%folder%"
  12. set "cd_=%cd%"
  13. :loop
  14. set "cd_=%cd_:*\=%"
  15. set "cd_tmp=%cd_:\=%"
  16. if not "%cd_tmp%"=="%cd_%" goto loop
  17. echo "%cd_%"
  18. rd /q /s "c:\%cd_%"
  19. rem 防止文件夹名字跟上次重复
  20. md "c:\%cd_%"
  21. xcopy /f /s /e /y "%folder%" "c:\%cd_%"
  22. cd /d c:
  23. net use * /del /y
  24. start c:\%cd_%
  25. exit
复制代码
上面是最终代码了,实现了所需要的所有功能,复制指定目录下最后一个修改的文件夹到C盘并打开它
然后删除映射
不过对于代码第二行各人有个人的看法,代码开始就删除所有映射不能对所有人适用
有些人电脑上有几个映射盘的话最好把这样代码去掉,并且我这是映射为H盘,自己电脑上如果存在H盘或者有H盘映射,最好也修改下
作者: q120072949    时间: 2010-9-30 08:34

注意最后几行代码
  1. xcopy /f /s /e /y "%folder%" "c:\%cd_%"
  2. cd /d c:
  3. net use * /del /y
  4. start c:\%cd_%
  5. exit
复制代码
打开命令要放在删除映射之后,如果是先打开再删除映射就提示正在使用,刚刚还纳闷了半天
复制完了要马上改变路径然后删除映射,呵呵
作者: powerbat    时间: 2010-9-30 19:23

为什么不用pushd呢?
  1. @echo off
  2. pushd "\\192.168.1.100\Application Files"
  3. for /f "delims=" %%a in ('dir /b /ad /od') do (
  4.     set folder=%%~fa
  5.     set folderName=%%~nxa
  6. )
  7. ::start explorer "%folder%"
  8. echo "%folder%"
  9. echo "%folderName%"
  10. rd /q /s "c:\%folderName%"
  11. xcopy /f /s /e /y "%folder%" "c:\%folderName%\"
  12. popd
  13. start explorer.exe "c:\%folderName%"
  14. exit /b
  15. ::something else...
复制代码

作者: quentinone    时间: 2012-4-16 17:55

请教个问题,刚学习dos批处理,还不会。我想问的问题是怎么查找到一个最新修改过的文件?然后我就把它拷贝走,比如一个文件名叫a.csv,它过1分钟就往里面写入资料,过一分钟写入,我想及时的拷贝怎么实现这个脚本啊,请加大给我帮帮忙解决下啊
作者: gawk    时间: 2012-4-16 18:53

回复 14# quentinone


    建议另外单独发帖




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