我有这样的文件名:
M0654871_07_05_2011.pdf
M0654871_07_15_2011.pdf
07_05_2011是日期(MM_DD_YYYY),M之后的第一个数字只是一个“随机”数字。
我正在编写一个循环遍历该目录中所有文件的.bat文件。我希望脚本在每天计算文件(基于文件名,而不是修改日期)。
批处理脚本中似乎没有任何正则表达式。有没有办法在Windows .bat脚本中完成此操作而无需下载更多工具/软件?
(我可能会针对每天的每个文件名字符串检查字符串的硬循环,但考虑到有10k +文件,这有点多了。)
我发现findstr可以在某种程度上执行正则表达式,但有没有办法用它来循环文件并提取每个日期的文件数,而不是循环日期和拉出文件数?
答案 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?)