下面的脚本对源目录中的文件进行计数,并根据计数和文件名执行不同的操作。如果有两个或更多文件,则以代码 2 退出。如果没有文件,则以代码 0 退出。如果只有一个文件,则检查文件名是否为“MT569”。如果是,则将文件复制到目标目录,并且脚本以代码 1 退出。如果文件名不是“MT569”,则以代码 3 退出。
@echo off
setlocal enabledelayedexpansion
set "sourceDir=C:\Users\tar\Desktop\inbound"
set "targetDir=C:\Software\components\data\GateIn\in"
set "count=0"
for %%I in ("%sourceDir%\*.*") do (
set /a "count+=1"
set "filename=%%~nI"
)
if %count% geq 2 (
exit /b 2
) else if %count% equ 0 (
exit /b 0
) else if %count% equ 1 (
for /f %%A in ('powershell -command "[System.Text.RegularExpressions.Regex]::IsMatch('!filename!', 'YourPattern')"') do (
if %%A equ 1 (
xcopy /y "%sourceDir%\!filename!.*" "%targetDir%"
exit /b 1
) else (
exit /b 3
)
)
)
endlocal
问题 - 这基本上是我陷入困境并需要你的帮助的地方。 我不使用文件名“MT569”,而是期待以下类型的文件。 COLLAT.CONFIDENTIAL.20231013125640.NO-ACCT.416.ISO
因此,我尝试在批处理脚本中使用正则表达式“COLLAT.CONFIDENTIAL.\d{14}.NO-ACCT.\d{3}.ISO”,但是在标准 Windows 批处理脚本中,我认为我无法使用直接正则表达式。
有人可以帮我解决这个问题吗?
谢谢,
我不知道解决办法
这是您问题的可能解决方案:
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET "sourcedir=u:\your files"
SET /a count=0
FOR %%e IN ("%sourcedir%\COLLAT.CONFIDENTIAL.*.NO-ACCT.*.ISO") DO FOR /f "tokens=3,5delims=." %%b IN ("%%~nxe") DO (
SET "critical=%%b%%c9"
FOR /l %%y IN (0,1,9) DO SET "critical=!critical:%%y=!"
IF NOT DEFINED critical (
SET "critical=%%b-%%c-"
IF "!critical:~14,1!" equ "-" IF "!critical:~18!" equ "-" (
SET /a count +=1
SET "filename=%%~nxe"
)
)
)
ECHO %count% %filename%
GOTO :EOF
首先,使用文件掩码仅选择那些与您的模式匹配的文件名。
接下来,对文件名进行标记。我们只需要检查两个数字部分的长度是否正确并且是纯数字。
将
critical
设置为两个文件名部分的串联,加上 9
。
将
critical
中的每个数字替换为无(备用的9
确保critical
在最后一次替换之前不会变成空)
如果
critical
中的结果是 nothing,那么 critical
中不存在非数字,所以我们需要检查这两个长度是否正确。
将
%%b
和 %%c
与一些破折号连接到 critical
。如果结果的第 15 个和第 19 个字符都是 -
,那么 %%b
和 %%c
的长度分别为 14 和 3,并且所有检查都已通过。
(请注意,
!var:~m,n!
中的第一个字符是字符“0”,因此14,18选择第15/19个字符)