【问题标题】:List of files between two timestamps两个时间戳之间的文件列表
【发布时间】:2015-04-20 08:28:54
【问题描述】:

使用下面的代码,我们可以列出两个日期之间的文件。 但我们还需要检查时间戳。即列出日期和时间之间的所有文件。

wmic datafile where "drive='%drive%' and path='%folder:\=\\%' and creationdate>'%start%' and creationdate<'%end%'" get creationdate, name, size

【问题讨论】:

  • wmic 会很慢...
  • @npocmaka - 只要指定了驱动器和完整路径,WMIC DATAFILE 的性能就不会那么差。

标签: file batch-file


【解决方案1】:

检查FileTimeFilterJS.bat 要在当前目录中的两个日期之间打印文件,请尝试使用 in:

call FileTimeFilterJS "." -beginDate "September 1, 2014 10:15 AM" -endDate "November 1, 2014 10:15 PM"

【讨论】:

  • 感谢您的回复。但这对我不起作用。任何其他解决方案 .@echo off setlocal set "drive=%~d1" set "folder=%~pnx1\" set /a "start=%~2, end=%~3" wmic datafile where "drive='%drive %' and path='%folder:\=\\%' and creationdate>'%start%' and creationdate
  • @user4809060 - 时间戳是什么意思?
  • 日期+时间 20150420210712 (YYYYMMDDHHmmss)
  • 我试过 find 。 -type f -newermt "2014-10-08 10:17:00" ! -newermt“2014-10-08 10:53:00”。但它也不起作用。任何快速帮助。谢谢
  • @user4809060 也检查一下这个github.com/npocmaka/batch.scripts/blob/master/hybrids/.net/… - 它基本上是相同的工具,但使用.NET 并且日期格式更方便。您可以更新它以使用适合您的文件格式
【解决方案2】:

在 WMI 查询中使用时间戳很痛苦。您必须以'YYYYMMDD' 格式指定日期,或以'YYYYMMDDhhmmss.ffffffSZZZ' 格式指定日期和时间

在哪里

  • YYYY = 完整的四位数年份
  • MM = 两位数月份
  • DD = 两位数的月份日期
  • hh = 24 小时格式的两位数小时
  • mm = 两位数的分钟数
  • ss = 两位数秒
  • .ffffff = 六位小数秒(微秒)
  • SZZZ = 时区表示为与 UTC 时间偏移的分钟数
    • S = 时区符号,+-
    • ZZZ = 三位数分钟

表示日期时,字符串长度必须正好为 6 个字符。
例如,2015 年 1 月 15 日表示为 '20150115'

在表示日期时间时,字符串的长度必须正好为 25 个字符。
例如,东部标准时间 2015 年 1 月 15 日下午 3:14 表示为
'20150115151400.000000-300'

因此您现有的查询不必更改。您只需要确保您的%start%
%end% 字符串的格式正确无误。

【讨论】:

  • 我尝试使用 DateTime。但是我得到了“无效的数字。数字被限制为 32 位精度”作为错误。
  • 是否有其他方法可以在不使用 WMI 的情况下列出文件
  • @user4809060 - 我不知道该说什么。我使用了带有正确格式的日期时间值的确切代码,并且效果很好。定义开始和结束时是否使用了 SET /A?那是行不通的——你需要使用普通的 SET,因为你定义的是一个字符串,而不是一个数字。
【解决方案3】:

另一种更简单(更快!)的方法是这个:

编辑:我修改了以前的代码,所以它现在处理创建日期,而不是最后修改的日期。

@echo off
setlocal EnableDelayedExpansion

if "%~2" neq "" goto begin
echo Usage: %0  YYYYMMDDHHMMstart  YYYYMMDDHHMMend
goto :EOF

:begin
for /F "skip=5 tokens=1-7* delims=/: " %%a in ('dir /A-D /T:C *.*') do (
   if "%%h" equ "" goto break
   set "hour=%%d"
   if "%%f" equ "p.m." set /A "hour=(1%%d+12)%%100"
   set "fileDate=%%c%%a%%b!hour!%%e"
   if "!fileDate!" geq "%~1" if "!fileDate!" leq "%~2" echo %%a/%%b/%%c  %%d:%%e %%f   %%g   %%h
)
:break

是的,我知道这种方法不包括秒数,并且取决于区域设置,但对于 OP 和一定数量的用户来说可能就足够了。可以通过将%%c%%a%%b 顺序更改为适当的顺序(如%%c%%b%%a)以及对"tokens=1-7* 部分进行小幅调整来解决语言环境问题。

【讨论】:

    猜你喜欢
    • 2014-06-22
    • 2023-02-24
    • 2017-05-12
    • 2016-11-20
    • 1970-01-01
    • 2013-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多