2017-08-17 92 views
0

我有很多文件需要在移动到其他文件夹之前进行筛选。 过滤条件:批处理:筛选器文件名

[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 
+0

@LotPings is'nt如果我们把[PEQ],文件的第一个字符是P或E或Q?如我错了请纠正我。 – wina

+1

这是正确的,但是你的过滤器(?RegEx?)在'[PEQ]'的任何数字'*'后面都有一个下划线'_'您可以批量使用RegEX作为findstr或其他工具的参数(ported sed,grep)或PowerShell。批仅使用通配符。 – LotPings

回答

0

我希望你能理解一个通配符匹配*任意数量的任何字符和正则表达式*这意味着以前的比赛中的任何号码(也为零)之间的差异。与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正则表达式的能力是相当有限的。