如何列出时间戳大于x的文件

时间:2014-08-14 06:02:30

标签: batch-file

我正在尝试创建一个文件名列表,其中LastModified时间戳大于设定值。

我想,我非常接近以下内容:

@echo off
setlocal DisableDelayedExpansion

REM delete existing output file
for %%f in (_modified) do if exist %%f.txt del %%f.txt

REM hard code timstamp threshold
set lastTime=20140801000000
echo "lastTime=%lastTime%"

REM set folder to CWD
set "folder=%CD:~2%"
echo "folder=%folder%"

REM search files in folder with extension 'jpg'
FOR /F "skip=1 tokens=1*" %%a in (
        '"wmic datafile where (path='%folder:\=\\%\\' AND Extension='jpg') get 'File Name',LastModified"'
        ) do (
    FOR /F "delims=." %%B in ("%%b") do (
        if %%B LEQ %lastTime% (echo "%%B LEQ1") else (echo "%%B GEQ1")
        if %%B GEQ %lastTime% (echo "%%B GEQ2") else (echo "%%B LEQ2") 
        if %%B GEQ %lastTime% (
            echo %%B %%a>> _modified.txt))
)

但是,对于包含2个jpg文件的文件夹,其中一个文件的最后修改时间为2010-02-22,另一个是2014-08-14脚本打印:

"lastTime=20140801000000"
"folder=\test"
"20100222210624 LEQ1"
"20100222210624 GEQ2"
"20140814155354 LEQ1"
"20140814155354 GEQ2"

输出文件包含两个文件名,而不是只有一个的预期结果。

显然,LEQ / GEQ的比较并没有像我预期的那样有效,但我不确定什么是不正确的。

2 个答案:

答案 0 :(得分:2)

我建议你使用

if "%%B" LEQ "%lastTime%"

if x%%B LEQ x%lastTime%

将强制进行字母模式比较。我建议cmd尝试将值作为INT32进行比较,并将值转换为gobbledegook,因为它们是使用cmd的范围限制进行评估的

答案 1 :(得分:0)

(这不是答案,但我不能添加这么长的评论)

你能检查一下,LEQ / GEQ在简单的情况下是否正常工作(没有任何循环和文件操作)?即你可以运行以下代码吗?

@echo off
set a=20100222210624
set b=20140814155354
set lastTime=20140801000000        
if %a% LEQ %lastTime% (echo "%a% LEQ1") else (echo "%a% GEQ1")
if %b% GEQ %lastTime% (echo "%b% GEQ2") else (echo "%b% LEQ2") 

在我这边打印以下结果(如预期的那样):

"20100222210624 LEQ1"
"20140814155354 GEQ2"

如果您身边的情况相同,我们应该在其他地方搜索问题。

同样here你可以找到关于比较的东西:

  

IF仅在其中一个比较运算符(EQU,NEQ,   使用LSS,LEQ,GTR,GEQ)。始终是==比较运算符   导致字符串比较。

     

这是一个重要的区别,因为如果将数字比较为   它会导致意想不到的结果:" 2"将大于   " 19"和" 026"将超过" 26"。

     

正确的数字比较:IF 2 GEQ 15 echo"更大"

     

使用括号或引号将强制进行字符串比较:IF(2)GEQ   (15)回声"更大" IF" 2" GEQ" 15"回声"更大"

(另外,here在接受的答案中你可以找到另一种方法来比较文件的日期(即你可以为这种比较创建临时文件))