我正在尝试创建一个文件名列表,其中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的比较并没有像我预期的那样有效,但我不确定什么是不正确的。
答案 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在接受的答案中你可以找到另一种方法来比较文件的日期(即你可以为这种比较创建临时文件))