标题: [文件操作] [已解决]批处理如何得到各子文件夹里面文件日期最新的日期? [打印本页]
作者: hnfeng 时间: 2024-12-4 12:58 标题: [已解决]批处理如何得到各子文件夹里面文件日期最新的日期?
本帖最后由 hnfeng 于 2024-12-5 18:59 编辑
文件夹里面有许多的多层子文件夹
想得到里面所有文件中,最新的日期(用来判断备份是否正常)
想到的办法是,dir /o-d /a-d *.* 用一个变量让 for 只取第一个文件的日期(就是这个子文件夹里面的最新日期),但是需要逐个处理每个子文件夹。
这样得到所有子文件夹里面的最新日期后,再排序,得到一个最最新的日期。
虽然能实现,但是感觉蛮麻烦,且效率不高。
因为有多个这种文件夹要处理,所以想请教高手有什么更好的办法?
需要留意的是,系统是 Windows2003(就是XP级别的server),没有powershell
谢谢
作者: 77七 时间: 2024-12-4 14:40
- @echo off
- set str=2024/01/01 00:00
- setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('dir /b /s /a-d ^|find /v "%~nx0"') do (
- if "%%~ti" geq "!str!" (
- set str=%%~ti
- )
- )
- echo %str%
- endlocal
- pause
复制代码
作者: czjt1234 时间: 2024-12-4 15:06
没看懂,到底要获取什么最新的日期,是文件还是文件夹?
可能是文件夹吧,如果是文件,那就必须逐个判断
如果是文件夹,那么可以直接dir文件夹的时间
作者: hnfeng 时间: 2024-12-4 16:02
没看懂,到底要获取什么最新的日期,是文件还是文件夹?
可能是文件夹吧,如果是文件,那就必须逐个判断 ...
czjt1234 发表于 2024-12-4 15:06
就是文件夹里面所有文件的日期中,最新的日期。
例如 如果文件夹里面有文件在2024-11-20 更改过,之后就再无更改任何文件,那么这个最新日期就是2024-11-20
作者: hnfeng 时间: 2024-12-4 16:11
本帖最后由 hnfeng 于 2024-12-4 16:20 编辑
77七 发表于 2024-12-4 14:40
谢谢帮忙。这个方法可能较慢,因为要处理每个文件
我现在用的批处理是这样,希望指教速度能否更好:- @echo off&setlocal EnableDelayedExpansion&cd /d "%~dp0"&title %~nx0
- set LogFile="%~dpn0.Log"
- if exist _temp.txt del /f /q _temp.txt
-
- for /f "delims=" %%d in ('dir /b /ad') do (
- call :DoGetNewestDate %%d
- )
-
- echo;&pause
- exit
-
-
- :DoGetNewestDate
- echo 正在查询文件夹:%~1 ...
- dir /s /a-d /o-d "%~1" | findstr /bric:"202[4-5]-[0-1][0-9]-[0-3][0-9]*">_temp.txt
- for /f "tokens=*" %%f in ('dir /b _temp.txt') do (
- if %%~zf EQU 0 (
- echo %~1 找不到文件>>%LogFile%
- goto :EOF
- )
- )
- set n=1
- for /f "tokens=*" %%i in ('sort /r _temp.txt') do (
- if !n! EQU 1 (
- echo %~1 %%i
- echo %~1 %%i>>%LogFile%
- set /a n+=1
- )
- )
- del /f /q _temp.txt
- goto :EOF
复制代码
作者: 77七 时间: 2024-12-4 16:21
回复 5# hnfeng
文件夹有多少个?文件数量共有多少?
作者: qixiaobin0715 时间: 2024-12-4 16:54
没看太明白:- @echo off
- (for /f "delims=" %%i in ('dir /s /b /a-d') do if not "%%i"=="%~dp0" echo,%%~ti %%i)>temp1
- sort /r temp1>temp2
- set /p str=<temp2
- echo,%str%
- del temp?
- pause
复制代码
作者: hnfeng 时间: 2024-12-4 17:10
回复 hnfeng
文件夹有多少个?文件数量共有多少?
77七 发表于 2024-12-4 16:21
不一定,有的里面的文件数量较大。
不过你的方法可以扩展输出更多的有关文件信息
谢谢
作者: 77七 时间: 2024-12-4 17:21
回复 8# hnfeng
主要看看是什么数量级别的,代码肯定要因地制宜
如果共几千个文件,不如就2楼代码,花费不了多少时间;如果文件夹数量和文件仅差别几倍,2楼代码也可以;
如果文件较多,文件夹相对少,就按照楼主的思路,需要改动一下代码。
- @echo off
- cd /d "%~dp0"
- setlocal enabledelayedexpansion
- for /r /d %%d in (*) do (
- pushd "%%d"
- call :1
- popd
- )
- echo !str!
- endlocal
- pause
- exit
-
- :1
- for /f "delims=" %%i in ('2^>nul dir /b /a-d /o-d') do (
- if "%%~ti" geq "!str!" (
- set str=%%~ti
- )
- exit /b
- )
- exit /b
复制代码
作者: hnfeng 时间: 2024-12-4 17:42
回复 hnfeng
主要看看是什么数量级别的,代码肯定要因地制宜
如果共几千个文件,不如就2楼代码, ...
77七 发表于 2024-12-4 17:21
谢谢指教。我再研究下
作者: aloha20200628 时间: 2024-12-4 22:27
本帖最后由 aloha20200628 于 2024-12-4 22:32 编辑
回复 1# hnfeng
试试以下代码,存为 test.bat,但不要存于目标目录下!运行需要命令行参数指定一个 ‘目标目录’,或将 ‘目标目录’ 直接拖给 test.bat 亦可...
代码中的dir... sort... findstr... 都要 ‘裸奔’,没有套在 for...() 的管道中,虽会产生临时文件,但可充分提升效率,为临时文件须创建一个与目标目录分开的临时文件目录,代码中第二行预设 “d:\tmp” ,可由楼主自定义...- @echo off &if "%~1"=="" (exit/b)
- setlocal &set "_td=d:\tmp"
- (md "%_td%" &cd "%_td%" &del /q "?._") 2>nul
- dir /s/a-d/tw/o-d "%~1">"d._"
- sort /r "d._" /o "s._"
- set/p _f=<"s._"
- findstr /n ".*" "d._">"n._"
- findstr /iec:"%_f%" "n._">"f._"
- for /f "delims=:" %%n in (f._) do set/a "n=%%n-2"
- findstr /ib "%n%:" "n._">"d._"
- for /f "tokens=3* delims= " %%a in ("%_f%") do set "_f=%%b"
- for /f "tokens=1* delims=: " %%a in (d._) do set "_d=%%b"
- set "ff=%_d:~0,-4%\%_f%"
- echo,%ff%
- del/q "?._" 2>nul&endlocal&pause&exit/b
复制代码
作者: Five66 时间: 2024-12-4 23:41
没有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就行
作者: hnfeng 时间: 2024-12-5 09:09
回复 11# aloha20200628
谢谢相助,我研究下
作者: aloha20200628 时间: 2024-12-5 09:41
本帖最后由 aloha20200628 于 2024-12-5 10:21 编辑
回复 13# hnfeng
其实11楼代码中第6行已拿到全目录下的最新文件名了(变量 _f),只是缺少其路径,其后的代码就是要匹配出这个路径,变量 _f 的值如 ‘2024-12-04 18:55 690 abc.txt’,若仅为查看最新文件的时间参数,变量 _f 就是了,或更直接的是用以下命令行的一行流查看其输出列表的首行就可以了...- dir /s/a-d/tw/o-d "%~1"|sort /r
复制代码
作者: hnfeng 时间: 2024-12-5 18:59
回复 hnfeng
其实11楼代码中第6行已拿到全目录下的最新文件名了(变量 _f),只是缺少其路径,其后的代 ...
aloha20200628 发表于 2024-12-5 09:41
简洁,很棒
谢谢
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |