如何在Windows批处理脚本中使用指定正则表达式匹配文件名
解决Windows批处理中使用正则匹配特定文件名的问题
修改后的完整脚本
@echo off setlocal enabledelayedexpansion set "sourceDir=C:\Users\tar\Desktop\inbound" set "targetDir=C:\Software\components\data\GateIn\in" set "count=0" set "fullFilename=" for %%I in ("%sourceDir%\*.*") do ( set /a "count+=1" set "fullFilename=%%~nxI" :: 获取包含扩展名的完整文件名 ) if %count% geq 2 ( exit /b 2 ) else if %count% equ 0 ( exit /b 0 ) else if %count% equ 1 ( :: 调用PowerShell执行正则匹配 for /f %%A in ('powershell -command "[System.Text.RegularExpressions.Regex]::IsMatch('!fullFilename!', 'COLLAT\.CONFIDENTIAL\.\d{14}\.NO-ACCT\.\d{3}\.ISO')"') do ( if %%A equ 1 ( xcopy /y "%sourceDir%\!fullFilename!" "%targetDir%" exit /b 1 ) else ( exit /b 3 ) ) ) endlocal
关键修改说明
- 修正文件名获取:原脚本用
%%~nI仅获取不带扩展名的文件名,改为%%~nxI后可拿到包含.ISO后缀的完整文件名,确保正则匹配的准确性。 - 正则表达式转义:正则中的
.是通配符,要匹配文件名里的实际点,必须转义为\.,最终正则为COLLAT\.CONFIDENTIAL\.\d{14}\.NO-ACCT\.\d{3}\.ISO,其中:\d{14}匹配14位数字时间戳(如20231013125640)\d{3}匹配3位数字编号(如416)
- PowerShell调用逻辑:借助PowerShell的正则引擎完成匹配,返回
1表示匹配成功,0表示失败,批处理根据返回值执行对应操作。
逻辑验证
- 源目录文件数≥2:直接返回退出码2
- 源目录无文件:返回退出码0
- 仅1个文件时:
- 文件名匹配正则:复制到目标目录,返回退出码1
- 不匹配正则:返回退出码3
内容的提问来源于stack exchange,提问作者Jon Carter
相关产品推荐
相关产品推荐

