批处理:过滤文件名

时间:2017-08-17 07:51:47

标签: batch-file

我有很多文件需要在移动到其他文件夹之前进行过滤。 过滤条件:

[PEQ]*_[+-][1-9][0-9]_[P-R][0-9]_*[._][0-9]*

文件名示例:

P101_+19_R0_3.0_QA.txt

我尝试在批处理脚本中应用过滤器但没有任何反应。 我是否正确定义了过滤器?

我的剧本:

SET _ext1=txt
SETLOCAL ENABLEDELAYEDEXPANSION
for %%f in (%_source%\[PEQ]*_[+-][1-9][0-9]_[P-R][0-9]_*[._][0-9]*.%_ext1%) do (
    echo %%f  >> %LOG%
SET _path=%%~df%%~pf
    echo !_path! >> %LOG%

SET _filename=%%~nf
echo !_filename! >> %LOG%

echo. >> %LOG%
echo Processing !_filename! >> %LOG%
IF EXIST !_path!!_filename!*.%_ext1% (
    copy /Y "!_path!!_filename!*.%_ext1%" "%_target%" >> %LOG%

)
)
ENDLOCAL

1 个答案:

答案 0 :(得分:0)

我希望您理解匹配任意数量的任何字符的通配符*与RegEx *之间的区别,这意味着前一个匹配的任何数字(也为零)。与RE .一起使用任何字符.*将类似于通配符*

@Echo off & SETLOCAL ENABLEDELAYEDEXPANSION
SET _ext1=txt
for /f "delims=" %%f in (
    'dir /B "%_source%\*_*_*_*.%_ext1%" ^| Findstr /i "%_source%\[PEQ]*_[+-][1-9][0-9]_[P-R][0-9]_.*[._][0-9]*.%_ext1%" '
) do (
    echo %%f  >> %LOG%
    SET _path=%%~df%%~pf
    echo !_path! >> %LOG%

    SET _filename=%%~nf
    echo !_filename! >> %LOG%

    echo. >> %LOG%
    echo Processing !_filename! >> %LOG%
    IF EXIST !_path!!_filename!*.%_ext1% (
        copy /Y "!_path!!_filename!*.%_ext1%" "%_target%" >> %LOG%
    )
)
ENDLOCAL

您应首先在开放的cmd窗口中使用dir和findstr测试该行,
然后没有转义^和周围'

dir /B "%_source%\*_*_*_*.%_ext1%"

如果这适合作为第一个选择添加

dir /B "%_source%\*_*_*_*.%_ext1%" | Findstr /i "%_source%\[PEQ]*_[+-][1-9][0-9]_[P-R][0-9]_.*[._][0-9]*.%_ext1%"

并改变您的RegEx,直到它达到您想要的效果。

请记住,findstr RegEx功能非常有限。

相关问题