【问题标题】:Regex in Win7 batch script?Win7批处理脚本中的正则表达式?
【发布时间】:2012-03-05 23:03:45
【问题描述】:

我有这样的文件名:

M0654871_07_05_2011.pdf
M0654871_07_15_2011.pdf

其中 07_05_2011 是日期 (MM_DD_YYYY),M 之后的第一个数字只是一个“随机”数字。

我正在编写一个循环遍历该目录中所有文件的 .bat 文件。我希望脚本每天计算文件(基于文件名,而不是修改日期)。

批处理脚本中似乎没有任何正则表达式。有没有办法在 Windows .bat 脚本中完成此操作而无需下载更多工具/软件?

(我可能每天都针对每个文件名字符串检查字符串,但考虑到有 10k+ 个文件,这有点多)。

我发现 findstr 可以通过某种方式执行正则表达式,但有没有办法使用它循环文件并在每个日期提取文件数量,而不是循环日期并提取文件数量?

【问题讨论】:

    标签: windows-7 batch-file


    【解决方案1】:

    在 FINDSTR 中没有什么可以直接做你想做的事,但是使用 FOR 循环加上扩展子字符串和 SET 算法很容易做到。

    以下代码(没有 FINDSTR)可能足够好,具体取决于目录中可能存在的其他文件(未经测试,但除非我让一个愚蠢的错误溜走,否则应该可以工作)。该代码通过创建一个计数变量来工作,该变量的名称基于文件名中的日期。

    @echo off
    setlocal enableDelayedExpansion
    for %%F in (M*_??_??_????.pdf) do (
      set "fname=%%~nF"
      set /a fileDate_!fname:~-10!+=1
    )
    set fileDate_
    

    如果您想在名称的最后 10 个字符中更精确地查找有效日期,则可以将 DIR 的输出通过管道传输到 FINDSTR 正则表达式。 (再次未经测试)

    @echo off
    setlocal enableDelayedExpansion
    for /f %%F in ('dir /b M*_??_??_????.pdf ^| findstr /lixc:"M[0-9]*_[01][0-9]_[0-3][0-9]_[0-9][0-9][0-9][0-9]') do (
      set "fname=%%~nF"
      set /a fileDate_!fname:~-10!+=1
    )
    set fileDate_
    

    正则表达式并没有精确地将自身限制为有效日期,但很可能它就足够了。使用多个正则表达式搜索字符串可能会更精确,但 FINDSTR 的严重限制将使其比应有的更困难(请参阅What are the undocumented features and limitations of the Windows FINDSTR command?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-06
      • 2014-02-05
      • 1970-01-01
      • 1970-01-01
      • 2018-06-14
      • 2012-01-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多