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

Datetime 批处理文件:迭代自给定日期起修改的文件,datetime,file,batch-file,loops,last-modified,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等。如果无法使用纯批处

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

伪代码:

foreach file C:\Images\*.jpg modified-since 1-1-2010 do
del file
我更喜欢纯批处理文件,而不是PowerShell、VBScript等。如果无法使用纯批处理语言,我可以使用小型/免费的第三方命令行程序来帮助生成修改后的文件列表。我需要支持在Windows 2000或更高版本中运行


我使用的最终解决方案是: (根据pipitas的回答稍作修改)

一些注意事项:删除/p以在每次删除时不需要Y/N确认。我对%字符进行了转义,以便它们可以在.bat文件中工作。要从管道中逃生,必须使用^。“usebackq”使backticks分隔要执行的命令(而不是搜索文本字符串或文件),tokens设置变量的数量以将解析的行放在%I开头,delims设置用于将行解析为这些标记的分隔符(包括尾随空格)

我添加了.jpg作为findstr搜索字符串,因为我只想处理.jpg文件。一些可能的问题是,您的区域设置可能会以不同的方式打印日期,需要不同数量的变量或不同的分隔符,并且您可能在文件名中有一些与嵌入的“.jpg”的假阳性匹配(需要findstr regex等)


如果您不需要支持Windows 2000及更早版本,请按照Johannes的建议使用
for files
,这样做会容易得多。

首先是一些预备知识:

  • 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”

但现在真正的问题开始了:创建日期和时间可能会以不同的格式打印,这取决于您的“区域设置”。你可以看到你自己,我现在的样子

如果我们能让日期以一种与数字顺序完全匹配的格式显示出来,这不是很有效吗?然后我们可以通过简单的数字比较来实现一些决定删除的逻辑。让我们试试看(如果这对我有效,它不一定对您有效——您可能需要适应您的区域设置)。请注意我使用的“反引号”(“`”)以及^-符号:

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个小时的循环中得到我的时间,代码<>代码<>代码> <代码> pm <代码>。因此,为了进行数值比较,我们必须将PM和AM分别替换为一个数值,这样我们对

04:51 AM
04: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

批处理文件将在Windows下执行,但它需要在每台Windows 2000或更高版本的计算机上运行,因此它不能使用Windows最新版本中的任何内容。我可以使用Windows 2000或更高版本中内置的任何东西,不过正如我所说的,我建议不要使用VBScript等,除非直接批处理文件无法做到这一点。令人遗憾的是,Windows 2000要求排除了这一点,而这正是您想要的。谢谢!有时,我认为批处理文件是微软对我们的报复,因为我们肯定做了一些非常糟糕的事情。我做了一些编辑,并使它工作。不过,在.bat文件中做任何非琐碎的事情的痛苦确实让我重新考虑不使用VBScript。
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. ]
        )
 )