如何在为 Windows 命令提示符编写的批处理脚本中输入正则表达式?

问题描述 投票:0回答:1

下面的脚本对源目录中的文件进行计数,并根据计数和文件名执行不同的操作。如果有两个或更多文件,则以代码 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 批处理脚本中,我认为我无法使用直接正则表达式。

有人可以帮我解决这个问题吗?

谢谢,

我不知道解决办法

regex windows powershell batch-file batch-processing
1个回答
0
投票

这是您问题的可能解决方案:

@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个字符)

© www.soinside.com 2019 - 2024. All rights reserved.