[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] [已解决]批处理如何得到各子文件夹里面文件日期最新的日期?

本帖最后由 hnfeng 于 2024-12-5 18:59 编辑

文件夹里面有许多的多层子文件夹
想得到里面所有文件中,最新的日期(用来判断备份是否正常)

想到的办法是,dir /o-d /a-d *.*  用一个变量让 for 只取第一个文件的日期(就是这个子文件夹里面的最新日期),但是需要逐个处理每个子文件夹。
这样得到所有子文件夹里面的最新日期后,再排序,得到一个最最新的日期。
虽然能实现,但是感觉蛮麻烦,且效率不高。

因为有多个这种文件夹要处理,所以想请教高手有什么更好的办法?

需要留意的是,系统是 Windows2003(就是XP级别的server),没有powershell

谢谢
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

  1. @echo off
  2. set str=2024/01/01 00:00
  3. setlocal enabledelayedexpansion
  4. for /f "delims=" %%i in ('dir /b /s /a-d ^|find /v "%~nx0"') do (
  5. if "%%~ti" geq "!str!" (
  6. set str=%%~ti
  7. )
  8. )
  9. echo %str%
  10. endlocal
  11. pause
复制代码
bat小白,请多指教!谢谢!

TOP

没看懂,到底要获取什么最新的日期,是文件还是文件夹?

可能是文件夹吧,如果是文件,那就必须逐个判断

如果是文件夹,那么可以直接dir文件夹的时间

QQ 20147578

TOP

没看懂,到底要获取什么最新的日期,是文件还是文件夹?

可能是文件夹吧,如果是文件,那就必须逐个判断 ...
czjt1234 发表于 2024-12-4 15:06



    就是文件夹里面所有文件的日期中,最新的日期。
例如 如果文件夹里面有文件在2024-11-20 更改过,之后就再无更改任何文件,那么这个最新日期就是2024-11-20

TOP

本帖最后由 hnfeng 于 2024-12-4 16:20 编辑
77七 发表于 2024-12-4 14:40



    谢谢帮忙。这个方法可能较慢,因为要处理每个文件
我现在用的批处理是这样,希望指教速度能否更好:
  1. @echo off&setlocal EnableDelayedExpansion&cd /d "%~dp0"&title %~nx0
  2. set LogFile="%~dpn0.Log"
  3. if exist _temp.txt del /f /q _temp.txt
  4. for /f "delims=" %%d in ('dir /b /ad') do (
  5.   call :DoGetNewestDate %%d
  6. )
  7. echo;&pause
  8. exit
  9. :DoGetNewestDate
  10. echo 正在查询文件夹:%~1 ...
  11. dir /s /a-d /o-d "%~1" | findstr /bric:"202[4-5]-[0-1][0-9]-[0-3][0-9]*">_temp.txt
  12. for /f "tokens=*" %%f in ('dir /b _temp.txt') do (
  13.   if %%~zf EQU 0 (
  14.     echo %~1 找不到文件>>%LogFile%
  15.     goto :EOF
  16.   )
  17. )
  18. set n=1
  19. for /f "tokens=*" %%i in ('sort /r _temp.txt') do (
  20.   if !n! EQU 1 (
  21.     echo %~1 %%i
  22.     echo %~1 %%i>>%LogFile%
  23.     set /a n+=1
  24.   )
  25. )
  26. del /f /q _temp.txt
  27. goto :EOF
复制代码

TOP

回复 5# hnfeng


   文件夹有多少个?文件数量共有多少?
bat小白,请多指教!谢谢!

TOP

没看太明白:
  1. @echo off
  2. (for /f "delims=" %%i in ('dir /s /b /a-d') do if not "%%i"=="%~dp0" echo,%%~ti %%i)>temp1
  3. sort /r temp1>temp2
  4. set /p str=<temp2
  5. echo,%str%
  6. del temp?
  7. pause
复制代码

TOP

回复  hnfeng


   文件夹有多少个?文件数量共有多少?
77七 发表于 2024-12-4 16:21



    不一定,有的里面的文件数量较大。
不过你的方法可以扩展输出更多的有关文件信息
谢谢

TOP

回复 8# hnfeng


   主要看看是什么数量级别的,代码肯定要因地制宜
如果共几千个文件,不如就2楼代码,花费不了多少时间;如果文件夹数量和文件仅差别几倍,2楼代码也可以;
如果文件较多,文件夹相对少,就按照楼主的思路,需要改动一下代码。


  1. @echo off
  2. cd /d "%~dp0"
  3. setlocal enabledelayedexpansion
  4. for /r /d %%d in (*) do (
  5. pushd "%%d"
  6. call :1
  7. popd
  8. )
  9. echo !str!
  10. endlocal
  11. pause
  12. exit
  13. :1
  14. for /f "delims=" %%i in ('2^>nul dir /b /a-d /o-d') do (
  15. if "%%~ti" geq "!str!" (
  16. set str=%%~ti
  17. )
  18. exit /b
  19. )
  20. exit /b
复制代码
bat小白,请多指教!谢谢!

TOP

回复  hnfeng


   主要看看是什么数量级别的,代码肯定要因地制宜
如果共几千个文件,不如就2楼代码, ...
77七 发表于 2024-12-4 17:21


谢谢指教。我再研究下

TOP

本帖最后由 aloha20200628 于 2024-12-4 22:32 编辑

回复 1# hnfeng

   试试以下代码,存为 test.bat,但不要存于目标目录下!运行需要命令行参数指定一个 ‘目标目录’,或将 ‘目标目录’ 直接拖给 test.bat 亦可...
   代码中的dir... sort... findstr... 都要 ‘裸奔’,没有套在 for...() 的管道中,虽会产生临时文件,但可充分提升效率,为临时文件须创建一个与目标目录分开的临时文件目录,代码中第二行预设 “d:\tmp” ,可由楼主自定义...
  1. @echo off &if "%~1"=="" (exit/b)
  2. setlocal &set "_td=d:\tmp"
  3. (md "%_td%" &cd "%_td%" &del /q "?._") 2>nul
  4. dir /s/a-d/tw/o-d "%~1">"d._"
  5. sort /r "d._" /o "s._"
  6. set/p _f=<"s._"
  7. findstr /n ".*" "d._">"n._"
  8. findstr /iec:"%_f%" "n._">"f._"
  9. for /f "delims=:" %%n in (f._) do set/a "n=%%n-2"
  10. findstr /ib "%n%:" "n._">"d._"
  11. for /f "tokens=3* delims= " %%a in ("%_f%") do set "_f=%%b"
  12. for /f "tokens=1* delims=: " %%a in (d._) do set "_d=%%b"
  13. set "ff=%_d:~0,-4%\%_f%"
  14. echo,%ff%
  15. del/q "?._" 2>nul&endlocal&pause&exit/b
复制代码

TOP

没有powershell可以装一个版本2.0其实也够用
https://www.catalog.update.microsoft.com/Search.aspx?q=kb968930
(貌似需要先装net framework2.0)

或者换用其他第三方 ,比如nodejs
https://nodejs.org/download/release/v4.9.1/
直接下win-x86或win-x64里面的那个exe就行

TOP

回复 11# aloha20200628


    谢谢相助,我研究下

TOP

本帖最后由 aloha20200628 于 2024-12-5 10:21 编辑

回复 13# hnfeng

其实11楼代码中第6行已拿到全目录下的最新文件名了(变量 _f),只是缺少其路径,其后的代码就是要匹配出这个路径,变量 _f 的值如 ‘2024-12-04  18:55    690 abc.txt’,若仅为查看最新文件的时间参数,变量 _f 就是了,或更直接的是用以下命令行的一行流查看其输出列表的首行就可以了...
  1. dir /s/a-d/tw/o-d "%~1"|sort /r
复制代码
1

评分人数

    • 77七: 好方法!技术 + 1

TOP

回复  hnfeng

其实11楼代码中第6行已拿到全目录下的最新文件名了(变量 _f),只是缺少其路径,其后的代 ...
aloha20200628 发表于 2024-12-5 09:41



    简洁,很棒

谢谢

TOP

返回列表