Windows高级文件匹配

时间:2009-07-26 03:37:09

标签: windows regex batch-file

我正在尝试使用批处理文件列出目录中的文件,使得仅文件名(减去扩展名)仅匹配数字模式,例如像125646543.pdf这样的东西很容易表达为正则表达式[\ d] + \ .pdf但当然我没有这样的细节只有Windows机制......我试图用Windows-做这个只有机制,因为我无法在目标服务器上安装任何其他东西,至少在Windows Server 2000和2003上需要支持它。

我会针对这个特定的例子采取一个特定的解决方案,或者更具通用性的东西,而不仅仅是那些东西*和

我已经尝试使用set / a来为文件名添加一个数字,但由于它将字符串解释为环境变量而0(如果它们未定义),这不能很好地工作。我也试过使用if %% ~na GTR 0,但它也匹配文本文件名,例如report.pdf,因为它似乎在这种情况下进行字符串比较。

3 个答案:

答案 0 :(得分:25)

findstr可以在Windows下正常使用正则表达式。我试试:

dir /b | findstr /i "^[0-9][0-9]*\.pdf$"

"dir /b"只为您提供文件名,每行一个。正则表达式匹配一个或多个数字,后跟一个句点,后跟您想要的扩展名。对于任何扩展,您可以这样做:

dir /b | findstr "^[0-9][0-9]*\.[^\.]*$"

显然,如果还有其他情况更复杂,您可以调整正则表达式以适应。它没有UNIX正则表达式的全部功能,但它相当不错。

以下命令文件显示如何处理当前目录中符合“全数字”要求的每个pdf文件。

@echo off
setlocal enableextensions enabledelayedexpansion
for /f "usebackq" %%i in (`dir /b ^| findstr /i "^[0-9][0-9]*\.PDF$"`) do (
    set fspec=%%i
    echo.Processing !fspec!
)
endlocal

网站http://www.robvanderwoude.com/batchfiles.php是CMD文件魔术(以及更多内容)的非常好的资源。

答案 1 :(得分:2)

自win98以来,Windows为您提供了一个改进的编程工具。它叫做vbscript。

Set objFS = CreateObject("Scripting.FileSystemObject")
strFolder = "c:\test"
Set objFolder = objFS.GetFolder(strFolder)
For Each strFile In objFolder.Files
    strFileName = strFile.Name
    strExtension = objFS.GetExtensionName(strFile)
    strBase = objFS.GetBaseName(strFile)
    If IsNumeric(strBase) Then 'check if numeric
        WScript.Echo strBase
            'continue to process file here.......
    End If 
Next

有关vbscript的更多信息,请阅读manual

答案 2 :(得分:0)

我将目录结果通过管道传递给grep:

dir [<Drive>:][<Path>] * | grep /regex/
相关问题