Win7批处理脚本中的正则表达式?

时间:2012-03-05 23:03:45

标签: windows-7 batch-file

我有这样的文件名:

  

M0654871_07_05_2011.pdf
  M0654871_07_15_2011.pdf

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

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

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

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

我发现findstr可以在某种程度上执行正则表达式,但有没有办法用它来循环文件并提取每个日期的文件数,而不是循环日期和拉出文件数?

1 个答案:

答案 0 :(得分:1)

FINDSTR中没有任何内容可以直接执行您想要的操作,但使用FOR循环和扩展子字符串以及SET算法很容易。

以下代码(没有FINDSTR)可能已经足够好了,具体取决于目录中可能存在的其他文件(未经测试,但除非我让一个愚蠢的错误漏掉,否则应该有效)。该代码的工作原理是创建一个count变量,其名称基于文件名中的日期。

@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?