批处理文件:迭代自给定日期以来修改的文件

时间:2010-08-13 18:24:06

标签: datetime file batch-file loops last-modified

我想创建一个批处理文件来执行一个命令(删除文件,一个简单的例子,尽管我的命令是自定义/不同的),每个文件都匹配一个从某个日期开始修改的通配符(比如说* .jpg) (例如1-1-2010或更高版本)。日期可以在批处理文件中进行硬编码,也可以作为命令行参数传递。

伪代码:

foreach file C:\Images\*.jpg modified-since 1-1-2010 do
del file

我更喜欢纯粹的批处理文件,而不是PowerShell,VBScript等。如果无法使用纯批处理语言,我可以使用小/免费的第三方命令行程序来帮助生成修改后的文件文件列表。我需要支持在Windows 2000或更高版本中运行。


我使用的最终解决方案:

(pipitas的答案略有修改)

@ECHO OFF
for /f "usebackq tokens=1-7* delims=/: " %%I in (`dir/o-d/tw ^| findstr /I .jpg`) do (
  if "%%K%%I%%J %%N %%L%%M" GEQ "20100801 AM 0000" (
    del /P %%P
  )
)

一些注意事项:删除/ P不需要在每次删除时确认Y / N.我转义了%字符,因此他们可以在.bat文件中工作。 ^是逃离管道所必需的。 “usebackq”使反引号分隔执行命令(而不是搜索文字字符串或文件),标记设置变量的数量以将解析的行放在以%I开头,并且delims设置分隔符(包括尾随空格)用于将行解析为这些令牌。

我添加了.jpg作为findstr搜索字符串,因为我只想处理.jpg文件。一些可能的问题是您的语言环境可能以不同方式打印日期,需要不同数量的变量或不同的分隔符,并且您可能在文件名中包含嵌入式“.jpg”的一些误报匹配(需要findtr正则表达式等)

如果您不需要支持Windows 2000及更早版本,那么使用Johannes建议的forfiles会更容易。

1 个答案:

答案 0 :(得分:3)

首先做几个预赛:

  • dir /od /tw /s ..\path\to\somedir: 列出所有目录的文件+子目录,按日期+上次修改时间排序,
  • dir /o-d /tw /s ..\path\to\somedir: 相同,但顺序相反(最后一个)。

接下来,我使用现有路径的本地示例。我们走吧:

dir /tc /o-d /s gstmp\*yell*.tif ^| findstr 2010
 Volume in Laufwerk C: hat keine Bezeichnung.
 Volumeseriennummer: D479-1658

 Verzeichnis von C:\downloads\gstmp

08/06/2010  05:01 PM           19 compression-g4-emptypage-tiffsep1(Yellow).tif
08/06/2010  05:00 PM           19 compression-lzw-emptypage-tiffsep1(Yellow).tif
08/06/2010  04:57 PM           19 compression-g3-tiffsep1(Yellow).tif
08/06/2010  04:57 PM           19 compression-crle-tiffsep1(Yellow).tif
08/06/2010  04:56 PM           19 compression-pack-share-tiffsep1(Yellow).tif
08/06/2010  04:53 PM           19 compression-g4-share-tiffsep1(Yellow).tif
08/06/2010  04:52 PM           19 compression-lzw-share-tiffsep1(Yellow).tif
08/06/2010  04:51 PM           19 compression-default-share-tiffsep1(Yellow).tif
08/06/2010  03:59 PM           19 compression-none-share-tiffsep.Yellow.tif
08/06/2010  03:55 PM           19 share-tiffsep.Yellow.tif
              10 Datei(en)       190 Bytes

此刻我们不喜欢其他标题和摘要信息。我们可以通过过滤来解决这个问题。我只会使用'2010'。

但现在真正的问题开始了:创建日期和时间可能会以不同的格式打印,具体取决于您的“区域设置”。你可以看到自己,它目前是如何找我的。

如果我们能够以一种与数字顺序完全匹配的格式显示日期,它会不会起作用?然后我们可以通过简单的数字比较来实现一些决定删除的逻辑。让我们试试(如果这对我有用,它不一定适合你 - 你可能需要采用你的语言环境)。注意我正在使用的'反引号'(“``”),以及^ -sign:

for /f "usebackq tokens=1-7* delims=/: " %I in (`dir/tc/o-d/s gstmp\*yell*.tif ^
   ^| findstr 2010`) do echo.    %I %J %K %L %M %N %O %P

此处输出:

08 06 2010 05 01 PM 19 compression-g4-emptypage-tiffsep1(Yellow).tif
08 06 2010 05 00 PM 19 compression-lzw-emptypage-tiffsep1(Yellow).tif
08 06 2010 04 57 PM 19 compression-g3-tiffsep1(Yellow).tif
08 06 2010 04 57 PM 19 compression-crle-tiffsep1(Yellow).tif
08 06 2010 04 56 PM 19 compression-pack-share-tiffsep1(Yellow).tif
08 06 2010 04 53 PM 19 compression-g4-share-tiffsep1(Yellow).tif
08 06 2010 04 52 PM 19 compression-lzw-share-tiffsep1(Yellow).tif
08 06 2010 04 51 PM 19 compression-default-share-tiffsep1(Yellow).tif
08 06 2010 03 59 PM 19 compression-none-share-tiffsep.Yellow.tif
08 06 2010 03 55 PM 19 share-tiffsep.Yellow.tif

我们几乎在那里,但尚未完全。我们需要将令牌%I %J %K的顺序更改为%K %I %J,以便我们的日期显示为2010 08 06,而不是08 06 2010。此外,如果我们编写没有空格的正确令牌,那么请获取日期+时间字符串,以便轻松比较。另外,我们跳过%O并用箭头替换它,只是为了它的乐趣:

for /f "usebackq tokens=1-7* delims=/: " %I in (`dir/tc/o-d/s gstmp\*yell*.tif ^
   ^| findstr 2010`) do echo.    %K%I%J%L%M%N ==^> %P

输出现在更改为:

201008060501PM ==> compression-g4-emptypage-tiffsep1(Yellow).tif
201008060500PM ==> compression-lzw-emptypage-tiffsep1(Yellow).tif
201008060457PM ==> compression-g3-tiffsep1(Yellow).tif
201008060457PM ==> compression-crle-tiffsep1(Yellow).tif
201008060456PM ==> compression-pack-share-tiffsep1(Yellow).tif
201008060453PM ==> compression-g4-share-tiffsep1(Yellow).tif
201008060452PM ==> compression-lzw-share-tiffsep1(Yellow).tif
201008060451PM ==> compression-default-share-tiffsep1(Yellow).tif
201008060359PM ==> compression-none-share-tiffsep.Yellow.tif
201008060355PM ==> share-tiffsep.Yellow.tif

现在你已经准备好比较第一个字段了。

但请考虑一下:我的时间为12小时,AMPM。因此,为了在数字上进行比较,我们必须使用数值替换PM和AM,这样我们的04:51 AM04:50 PM的翻译仍然会以正确的方式进行数字排序。

现在怎么样:

for /f "usebackq tokens=1-7* delims=/: " %I in (`dir/tc/o-d/s gstmp\*yell*.tif ^
     ^| findstr 2010`) do  (
        if "%K%I%J %N %L%M" GEQ "20100806 PM 0457"  (
            echo.   [ %K-%I-%J %L:%M %N    %P. ]
        )
 )

列出了应删除的所有文件,同时显示了各自的日期。要 真的 删除,我们只需要将echo. ... %P.替换为del/p/f/s %P