Board logo

标题: 求助,如何找出100分钟前修改过的文件呢? [打印本页]

作者: bibaboemail     时间: 2008-5-31 16:45    标题: 求助,如何找出100分钟前修改过的文件呢?
也就是文件的修改时间是100分钟以前的都列出来,在论坛里找了半天,实在没有,大家帮帮想想办法

作者: pusofalse     时间: 2008-5-31 17:07
思路。。。 当前时间减去100分钟。。。与当前日期一起赋值给n
for /r 遍历整个目录,if "%%~ta" lss "%n%" echo %%a

就是这个思路,想了半天没想出来如何当前时间减去100

作者: bibaboemail     时间: 2008-5-31 17:22
是呀,如果正好两天之间,比较麻烦,有个forfile,但是他不能精确到小时,或分钟,只能是天

作者: bibaboemail     时间: 2008-5-31 17:26
linux下的find命令有-mmin 参数可以修改,windows真的还不知道怎么办?大家给想想办法

作者: pusofalse     时间: 2008-5-31 17:36
花了半个多小时~ 终于搞定了~试下可以不

@echo off&setlocal enabledelayedexpansion
set/a n=%time:~3,2%+60
if %n% lss 100 (
set/a n=100-%n%,m=!time:~0,2!-2
set/a n=60-!n!
) else (
set/a n=100-%n%,set/a m=!time:~0,2!-1
set/a n=60-!n!
)
set n=%date:~0,-4% %m%:%n%
for /r c:\ %%a in (*.*) do if "%%~ta" leq "%n% echo %%a

作者: bibaboemail     时间: 2008-5-31 17:43
好,先谢谢了

作者: pusofalse     时间: 2008-5-31 17:44
错了。。。。。 试了下。。。当60+当前时间的分值大于100的情况下 会出错了

作者: bibaboemail     时间: 2008-5-31 17:51
哦,我还没有试验到那里呢,。。。。。

作者: pusofalse     时间: 2008-5-31 18:07
@echo off&setlocal enabledelayedexpansion
if "%time:~3,2%" lss "40" (
set/a n=!time:~3,2!+60
set/a n=100-!n!,m=!time:~0,2!-2
set/a n=60-!n!
) else (
set/a n=100-!time:~3,2!
set/a n=60-!n!
if "!n:~1,1!" equ "" set n=0!n!
set/a m=!time:~0,2!-1
)

set n=%date:~0,-4% %m%:%n%
for /r c:\ %%a in (*.*) do if "%%~ta" leq "%n%" echo %%a
pause

这回对了~

Last edited by pusofalse on 2008-5-31 at 06:09 PM ]

作者: 26933062     时间: 2008-5-31 18:10
计算时间还真是麻烦,又要判断是否垮天,还要判断是否00点。
初步测试ok。。望简化。。。

@echo off
for /f "tokens=1-3 delims=-/\:. " %%a in ("%date%") do (
set /a yy=%%a,mm=%%b,dd=100%%c%%100
)
for /f "tokens=1,2 delims=.: " %%a in ("%time%") do (
set /a d=100%%a%%100,s=^(^(d-1^)+24^)%%24,f=100%%b%%100-40
)
if %f% lss 0 set /a s-=1
set /a f=(f+60)%%60
if %s% gtr %d% set /a dd-=1
setlocal enabledelayedexpansion
for %%a in (mm dd s f) do set %%a=0!%%a!&set "%%a=!%%a:~-2!"
endlocal&set "t=%yy%-%mm%-%dd% %s%:%f%"
for /r %%a in (*) do if "%%~ta" leq "%t%" echo del/q "%%a"
pause

作者: bibaboemail     时间: 2008-5-31 18:11
麻烦写一个完整,我主要显示指定目录下,100分钟以前修改过的文件名称

非常感谢

作者: pusofalse     时间: 2008-5-31 18:12
我的没有判断是否跨天。。。。 也没有判断是否00点。。。建议楼主不要在午夜使用~

作者: bibaboemail     时间: 2008-5-31 18:17
不管怎么还是谢谢大家,我先慢慢消化

作者: 26933062     时间: 2008-5-31 18:17
100分钟以前修改过的文件名?
看来我走题了,
我的是显示修改时间小于100分钟以前的文件名。

作者: wfy150     时间: 2008-5-31 18:33
问下这个set/a !变量!中的"!"是怎么用的?

作者: pusofalse     时间: 2008-5-31 18:34
Originally posted by wfy150 at 2008-5-31 06:33 PM:
问下这个set/a !变量!中的"!"是怎么用的?

搜索 变量延迟详解

作者: hyu029     时间: 2008-6-1 01:56
学习了

作者: bat-zw     时间: 2008-6-1 02:57    标题: 我来剖析下这个问题:

&&这个问题看似简单,实际上复杂的要死,要写出完全通用的代码就必须涉
及到如下问题:
一、对分的判断,判断当前分减去40是不是小于0,如小于0则应加上60,并
把时减去1;
二、对时的判断,判断当前时减去1是不是小于0,如小于0则要加24,并把天
减去1;
三、对日的判断,判断当前天减1是不是等于0,如等于0,则把日设成上月的
最后一天(这里还要对上月的最后一天进行判断是为31还是30还是29还是28),
并将月减1;
四、对月的判断,判断当前月减1是不是等于0,如等于0,则把月设为12月,
并将年减1;
五、对年的判断,要判断是不是闰年,是的就要将2月设为29天,不是的将2
月设为28天(闰年标准判断法:能被4整除但不能被100整除以及能被400整除的
年为闰年)。
如当前时间为2100-03-01 0:00:10要判断起来就是件很麻烦的事!!!


Last edited by zw19750516 on 2008-6-1 at 03:12 AM ]

作者: bat-zw     时间: 2008-6-1 04:38    标题: 我给的答案:
代码确实有点吓人,但应该是通用的:

@echo off&setlocal enabledelayedexpansion
set /a y=%date:~,4%,m=100%date:~5,2%%%100,d=100%date:~8,2%%%100,mi=100%time:~3,2%%%100
if "%time:~,1%"=="" (set h=%time:~1,1%) else (set h=%time:~,2%)
set /a a=%y%%%4,b=%y%%%100,c=%y%%%400
if %c% equ 0 (set yun=A) else (if %a% equ 0 if %b% neq 0 set yun=A)
if defined yun (set n=29) else (set n=28)
set /a mi-=40,h-=1
if %mi% lss 0 set /a mi+=60,h-=1
if %h% lss 0 set /a h+=24,d-=1
if %d% equ 0 set /a m-=1&goto lp
:cont
for %%i in (%y% %m%) do if %%i lss 10 (set str=!str!0%%i) else (set str=!str!%%i)
for %%i in (%d% %h% %mi%) do if %%i lss 10 (set var=!var!0%%i) else (set var=!var!%%i)
for /f "tokens=1,2,3,4,5,7 delims=-/: " %%a in ('dir /s /a-d *.*') do (
if %%a%%b lss %str% (
echo.%%f
) else (
if %%a%%b equ %str% if %%c%%d%%e lss %var% echo.%%f
)
)
pause>nul&goto :eof
:lp
if %m% equ 2 set d=%n%&goto cont
if %m% equ 0 set m=12&set /a y-=1
for %%i in (1 3 5 7 8 10 12) do if %%i equ %m% set d=31&goto cont
for %%i in (4 6 9 11) do if %%i equ %m% set d=30&goto cont


Last edited by zw19750516 on 2008-6-1 at 04:48 AM ]

作者: terse     时间: 2008-6-1 15:07
也发一个对年月日的判断 欢迎测试

@echo off&set tt=0
for /f "tokens=1-3 delims=-/\:. " %%i in ("%date%") do set /a p1=%%i,p2=100%%j%%100,p3=100%%k%%100
for /f "tokens=1-3 delims=:" %%i in ('time/t') do set /a t1=100%%i%%100,t2=100%%j%%100
set/a t1-=1,t2-=40
if %t2% lss 0 set/a t2+=60,t1-=1
if %t1% lss 0 set/a tt+=1,t1+=24
if %p3% gtr %tt% goto ppp
:nxt
set/a p2-=1
if %p2% equ 0 set/a p1-=1&&set p2=12
set/a PN2="!(p1%%4)&!(!(p1%%100))|!(p1%%400)",PN2=28+PN2
for /f "tokens=%p2%" %%i in ("31 %pN2% 31 30 31 30 31 31 30 31 30 31") do set/a p3=%p3%+%%i
if %p3% leq %tt% goto nxt
:ppp
setlocal enabledelayedexpansion
set/a p3=%p3%-%tt%
for %%i in (p2 p3 t1 t2) do if "!%%i!" lss 10 set %%i=0!%%i!
for /f "tokens=*" %%i in ('dir /b /a-d "*.*" 2^>nul') do (
set "ta=%%~ti"
if not "%%~fi" == "%~f0" (
if "!ta:~0,4!!ta:~5,2!!ta:~8,2!!ta:~11,2!!ta:~14,2!" leq "!p1!!p2!!p3!!t1!!t2!" echo "%%~fi"
))
pause

作者: plp626     时间: 2008-6-1 16:24
作者: terse     时间: 2008-6-1 18:01
Originally posted by plp626 at 2008-6-1 16:24:
要函数库干什么?
http://www.cn-dos.net/forum/viewthread.php?tid=39843&fpage=1&highlight=%E5%87%BD%E6%95%B0%E5%BA%93

我不是鸟人 这个鸟语还真看不懂 一个一个分开还差不多 哈哈 玩笑了

作者: bat-zw     时间: 2008-6-1 19:40
Originally posted by terse at 2008-6-1 15:07:
也发一个对年月日的判断 欢迎测试
if "!ta:~0,4!!ta:~5,2!!ta:~8,2!!ta:~11,2!!ta:~14,2!" leq "!p1!!p2!!p3!!t1!!t2!" echo "%%~fi"
))


&&这个好像是比较不了大小的,举个例子200805120728(2008年5月12日7
时28分)数值的总位数为12位超出了CMD所能处理的最大数值2147483647,所
以要把它分成两段来比较,我是先将前面的年月数值进行比较,如相同再比较后
面的天时分的数值。

作者: plp626     时间: 2008-6-1 20:26
Originally posted by zw19750516 at 2008-6-1 07:40 PM:


&&这个好像是比较不了大小的,举个例子200805120728(2008年5月12日7
时28分)数值的总位数为12位超出了CMD所能处理的最大数值2147483647 ...


加上引号后 if判断是以ascii码大小一个一个往后判断,原理上可以判断任意大的数。

作者: 26933062     时间: 2008-6-1 20:28
不错,所以terse兄有 set %%i=0!%%i! 这样的处理过程,保证了位数是一样的,所以可以判断任意大的数。

Last edited by 26933062 on 2008-6-1 at 08:30 PM ]