批量文件for循环和使用delims

时间:2015-06-09 15:23:27

标签: batch-file for-loop

我在Windows服务器中创建了一个批处理文件,用于解析存储在文件夹中的文件的名称。 该文件的名称包含一系列由连字符分割的参数,例如: ACC-INV-APR-2015

我需要检查前两个参数(部门和文档类型)的语法正确性,例如我会避免连字符在文件名中插入超过一次。 在检查的基础上,语法错误的文件将被移动到文件夹中。

我们必须考虑到,除了必须的前两个参数之外,其他参数可以被跳过,因此文件名可能在前两个参数之后有一些重复的超量,例如

FIN-DOC-APR-2015 - MFH-P01

我们会避免使用以下文件名:FIN - DOC-APR-2015-MFH-P01

我创建了以下批处理文件,但我不知道如何使用错误的语法跳过文件名....

谢谢。

setlocal EnableDelayedExpansion
set source=\\fileserver\share$\archive
set dest_ok=\\fileserver\share$\fileok
set dest_not=\\fileserver\share$\error

FOR /R %source% %%f in (*.*) do call :Proc1 "%%f"
goto End


:Proc1
Set filename=%1%
For %%A in (%filename%) do (
    Set Folder="%%~dpA"     
    Set Name=%%~nxA
)

for /f "tokens=1,2 delims=- " %%a in ("%Name%") do call :Proc2 %%a %%b
goto :eof

:Proc2
set department=%1
set typedoc=%2
FINDSTR /x "%department%" c:\0_scripts\arch\departments.txt
if %errorlevel%==0 FINDSTR /x "%typedoc%" c:\0_scripts\arch\typedocs.txt
if %errorlevel%==0  move /Y %filename% %dest_ok%
if %errorlevel%==1  move /Y %filename% %dest_not%
goto :eof


:End

3 个答案:

答案 0 :(得分:0)

听起来像正则表达式的工作。 Windows实用程序findstr将允许您根据正则表达式进行匹配。如果找到则退出状态0,否则退出非零。这适用于conditional execution。在cmd控制台中,输入findstr /?以获取有关支持的regexp语法的详细信息。

它还可以加速将departments.txt和typedocs.txt的内容缓存到变量中,而不是为每个检查的文件打开,读取,关闭,重复。

所以,考虑到这一点,我在这里是如何做到的:

@echo off
setlocal

set "source=\\fileserver\share$\archive"
set "dest_ok=\\fileserver\share$\fileok"
set "dest_not=\\fileserver\share$\error"
set "departments.txt=c:\0_scripts\arch\departments.txt"
set "typedocs.txt=c:\0_scripts\arch\typedocs.txt"

setlocal enabledelayedexpansion
for /f "usebackq delims=" %%I in ("%departments.txt%") do set "dept=%%~I;!dept!"
for /f "usebackq delims=" %%I in ("%typedocs.txt%") do set "type=%%~I;!type!"
endlocal & set "dept=%dept%" & set "type=%type%"

for /r "%source%" %%I in (*) do (

    rem // Does filename match /^[a-z]+-[a-z]+/i ?
    echo %%~nxI | findstr /i "^[a-z][a-z]*-[a-z][a-z]*" >NUL && (

        rem // Yep.  Check whether department and doc type is in allowed list.
        for /f "tokens=1-2 delims=- " %%a in ("%%~nxI") do (

            // if %dept% doesn't equal itself with %%~a removed, and so on...
            setlocal enabledelayedexpansion
            if not "%dept%"=="!dept:%%~a=!" if not "%type%"=="!type:%%~b=!" (

                // All checks passed.  Moved to OK folder.
                move /y "%%~fI" "%dest_ok%"
            )
            endlocal
        )
    )
    // If the file hasn't been moved by now, it must've failed a test.
    if exist "%%~fI" move /y "%%~fI" "%dest_not%"
)

答案 1 :(得分:0)

C:\0_scripts\arch>(
echo MFH3-FHW-20150529-F001MD14895-20301231-V01-OP20-TRIFLEX-CP1_H--.pdf   | findstr /i "^[a-z][a-z]*-[a-z][a-z]*"   1>N
UL  && (for /F "tokens=1-2 delims=- " %a in ("MFH3-FHW-20150529-F001MD14895-20301231-V01-OP20-TRIFLEX-CP1_H--.pdf") do (

setlocal enabledelayedexpansion
 if not "TEF6;TEF10;QMM8;QMM73;QMM72;QMM71;QMM7;QMM6;QMM13;QMM1;QMM;MFP2;MFP1;MFH3;MFH2;MFH1;MFH ;MFG3;MFG22;MFG21;MFG2;
MFG11;MFG1;MFG;MFB;HSE;COS;" == "!dept:%~a=!" if not "WPL;WP;WBP;WB;WAL;WAG;WA;VTL;VTK;VDP;VBT;VBL;VB;VAW;VAP;VA;UVA;UMV
;TSS;TRN;TKU;TDC;SYM;SWD;SWC;SW;SVS;SVA;SV;STR;STL;STF;STB;SPC;SBT;SAM;RTZ;RTP;RPL;RP;RNO;RHW;RAW;QMP;QMA;QM;QBG;QB;QAM;
PZB;PUM;PRV;PRS;PRJ;PRA;PQP;PPM;PPK;PP;PNR;PLB;PH;PFH;PDV;PDR;PDC;PDB;PAP;PAL;PAG;OPS;OPL;OEE;NOR;NKA;MUB;MSZ;MON;MOD;MB
B;MNT;LZT;LZS;LZN;LPV;LPN;LPL;LPC;LPA;LHT;LDP;LBA;KSB;KPV;KPA;KOE;KOB;KBU;KBL;KB;IAM;HZG;HZ;HSE;HRB;HFG;HF;HE;HAZ;GMD;GE
Z;GBB;FVT;FRM;FPL;FPK;FPI;FPA;FP;FMP;FME;FMD;FMA;FLP;FLB;FIM;FHW;FGY;FGV;FGS;FGP;FGL;FGK;FGE;FGD;FGB;FGA;FDA;FA;EZZ;EWZ;
EWS;EVT;EV;ETZ;ETL;ESZ;EPB;EP;ECM;DVL;ECR;DV;DRX;DRW;DRV;DRQ;DRK;DRF;DMD;DIF;DLP;DER;DDI;DBL;DB;DAT;D01;CPC;CIP;CHL;CE;C
AP;BVT;BVS;BVB;BV;BUG;BSV;BST;BSS;BS;BPZ;BLD;BDL;BBL;BBD;BB;BAL;BAD;ANH;AGZ;AFK;AEN;AED;AAW;AA;" == "!type:%~b=!" (
move /y "\\server1\digit$\deposito\MFH3\MFH3-FHW-20150529-F001MD14895-20301231-V01-OP20-TRIFLEX-CP1_H--.pdf" "\\server1\digit$\errori"
 pause
)
 endlocal
) )
 if exist "\\server1\digit$\deposito\MFH3\MFH3-FHW-20150529-F001MD14895-20301231-V01-OP20-TRIFLEX-CP1_H--.pdf" move
 /y "\\server1\digit$\deposito\MFH3\MFH3-FHW-20150529-F001MD14895-20301231-V01-OP20-TRIFLEX-CP1_H--.pdf" "\\server11\digit$\ok"
 pause
)
        1 file(s) moved.
Press any key to continue . . .

答案 2 :(得分:0)

块引用

我已更改脚本并返回原始版本。

这是处理文件正确时批处理文件的输出:

如果存在" \ server1 \ digit $ \ deposito \ MFH3 \ MFH3 - FHW-20150512-F01MD14861-20301231-V02-OP20-TRIFLEX-CP1H - .pdf"移动 / y" \ server1 \ digit $ \ deposito \ MFH3 \ MFH3 - FHW-20150512-F01MD14861-20301231-V02-OP20-TRIFLEX-CP1H - .pdf" " \ SERVER1 \ 数字$ \误差1"  暂停 )         移动了1个文件。 按任意键继续 。 。

C:\ 0_scripts \拱>( echo MFH3-AFK-20150511-F01MD12340-20301231-V07-OP20-TRIFLEX-CP1_H - .pdf | findstr / i" ^ [a-z] [a-z] - [a-z] [a-z] " 1 GT; NU L&& (for / F"令牌= 1-2 delims = - "%a in(" MFH3-AFK-20150511-F01MD12340-20301231-V07-OP20-TRIFLEX-CP1_H - .pdf&# 34;)做( setlocal enabledelayedexpansion  如果不是" TEF6; TEF10; QMM8; QMM73; QMM72; QMM71; QMM7; QMM6; QMM13; QMM1; QMM; MFP2; MFP1; MFH3; MFH2; MFH1; MFH; MFG3; MFG22; MFG21; MFG2; MFG11; MFG1; MFG; MFB; HSE; COS;" =="!dept:%~a =!"如果不是" WPL; WP; WBP; WB; WAL; WAG; WA; VTL; VTK; VDP; VBT; VBL; VB; VAW; VAP; VA; UVA; UMV ; TSS; TRN; TKU; TDC; SYM; SWD; SWC; SW; SVS; SVA; SV; STR; STL; STF; STB; SPC; SBT; SAM; RTZ; RTP; RPL; RP; RNO; RHW; RAW ; QMP; QMA; QM; QBG; QB; QAM; PZB; PUM; PRV; PRS; PRJ; PRA; PQP; PPM; PPK; PP; PNR; PLB; PH; PFH; PDV; PDR; PDC; PDB; PAP; PAL; PAG; OPS; OPL; OEE; NOR; NKA; MUB; MSZ; MON; MOD; MB B; MNT; LZT; LZS; LZN; LPV; LPN; LPL; LPC; LPA; LHT; LDP; LBA; KSB; KPV; KPA; KOE; KOB; KBU; KBL; KB; IAM; HZG; HZ; HSE; HRB; HFG; HF; HE; HAZ; GMD; GE Z者除外; GBB; FVT; FRM; FPL; FPK; FPI; FPA; FP; FMP; FME; FMD; FMA; FLP; FLB; FIM; FHW; FGY; FGV; FGS; FGP; FGL; FGK; FGE; FGD; FGB; FGA; FDA; FA; EZZ; EWZ; EWS; EVT; EV; ETZ; ETL; ESZ; EPB; EP; ECM; DVL; ECR; DV; DRX; DRW; DRV; DRQ; DRK; DRF; DMD; DIF; DLP; DER; DDI; DBL; DB; DAT; D01; CPC; CIP; CHL; CE; C ^ AP; BVT; BVS; BVB; BV; BUG; BSV; BST; BSS; BS; BPZ; BLD; BDL; BBL; BBD; BB; BAL; BAD; ANH; AGZ; AFK; AEN; AED; AAW; AA; " =="!输入:%~b =!" ( move / y" \ server1 \ digit $ \ deposito \ MFH3 \ MFH3-AFK-20150511-F01MD12340-20301231-V07-OP20-TRIFLEX-CP1_H - .pdf" " \条 rv11 \数字$ \行"  暂停 )  ENDLOCAL ))  如果存在" \ server1 \ digit $ \ deposito \ MFH3 \ MFH3-AFK-20150511-F01MD12340-20301231-V07-OP20-TRIFLEX-CP1_H - .pdf"移动 / y" \ server1 \ digit $ \ deposito \ MFH3 \ MFH3-AFK-20150511-F01MD12340-20301231-V07-OP20-TRIFLEX-CP1_H - .pdf" " \ SERVER1 \ 数字$ \误差1"  暂停 )         移动了1个文件。 按任意键继续 。 。