2017-08-17 96 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正則表達式的能力是相當有限的。