2015-02-24 99 views
0

我有一個包含近百萬個XML文件的目錄。不用說,加載需要花費很長時間(20分鐘以上)。因此,我正在編寫一個腳本,將文件分成最高級別爲年份和每年下個月的文件夾。有4個主文件名,日期可以從第三個標記中提取,其餘的從第二個標記中提取。即:從XML文件中提取日期並將文件移動到從日期創建的目錄

BA1253570001_BALMIS_20130617_TRC_0_109506738E.xml 
BA1254260001_ACCTV21_20140430_AMR_0_1095611492.xml 
BA1736330001_SWFTOUT_20140929_LIQ_1_MTBX553494.xml 
BA1739240001_FEDOUT_20140904_LIQ_1_105633316M.xml 

其餘的都是這樣的:

EODMESS_20140718_MTBX473286.xml 
MSGCONF_20140410_109558667V.xml 

我敢肯定有一個更簡單的方式做到這一點,但這裏是我到目前爲止的代碼:

@echo on 
setlocal enabledelayedexpansion 
Set "starttime=%time%" 
pushd C:\temp\xmls 
for /f %%a in ('dir /b/o:d *.xml') do (
    call :ExtractDates %%a ret 
    echo %%a - !ret! 
    for /f "tokens=1" %%b in ("!ret!") do (
    for /f "tokens=1-3 delims=/" %%c in ("%%b") do (
     if not exist .\%%e md .\%%e 
     if not exist .\%%e\%%c md .\%%e\%%c 
     if %%b equ %%c/%%d/%%e (
     echo moving %%~nxa to .\%%e\%%c 
     echo move %%~nxa .\%%e\%%c 
     pause 
     ) 
    ) 
) 
) 
echo Start time: %starttime% 
echo End time: %time% 
popd 
exit /b 

:ExtractDates 
@echo on 
setlocal enabledelayedexpansion 
Echo Starting ExtractDates 
for %%a in (BALMIS ACCTV21 FEDOUT SWFTOUT) do (
    if not errorlevel 1 (set t=3) else set t=2 
    Call :ExtractFunc %~1 %%a !t! ret 
    endlocal&set "%~2=!ret!"&exit /b 0 
) 
exit /b 

:ExtractFunc 
@echo on 
setlocal 
Echo Starting ExtractFunc 
for /f "tokens=%3 delims=_" %%a in (
    'echo %~1^|Findstr "%~2"' 
    ) do ( 
    if not errorlevel 1 (
     endlocal&set "%~4=%%a"&exit /b 0 
    ) 
) 
exit /b 

問題是變量令牌沒有返回正確的數字,我不知道爲什麼。任何建議感激。

回答

1
@ECHO OFF 
SETLOCAL 
SET "sourcedir=U:\sourcedir\t w o" 
PUSHD "%sourcedir%" 
FOR /f "tokens=1*delims=" %%a IN (
    'dir /b /a-d "%sourcedir%\*_*_*.xml" ' 
) DO SET "filename=%%a"&CALL :process 

POPD 

GOTO :EOF 

:process 
FOR /f "tokens=2,3,6delims=_" %%m IN ("%filename%") DO SET "date1=%%m"&SET "date2=%%n"&SET "whichdate=%%o" 
IF DEFINED whichdate SET "date1=%date2%" 
IF NOT DEFINED date2 GOTO :eof 
ECHO(MD .\%date1:~0,4%\%date1:~4,2% 
ECHO(MOVE "%filename%" .\%date1:~0,4%\%date1:~4,2%\ 
GOTO :EOF 

您需要更改sourcedir的設置以適合您的情況。

爲了測試目的,所需的MD命令僅僅是ECHO驗證命令是否正確後,將ECHO(MD更改爲MD以實際創建目錄。附加2>nul以抑制錯誤消息(例如,當目錄已經存在時)

爲了測試目的,所需的MOVE命令僅僅是ECHO確認命令正確後,將ECHO(MOVE更改爲MOVE以實際移動文件。附加>nul抑制報告消息(例如。1 file moved

只需提取兩個可能datestrings並使用第六令牌的存在信號,以選擇用於產生目標目錄的所述兩個位置中的。如果沒有第三個標記跳過(不符合指定的掩碼)

然後選擇date1所需的字段並執行一些子字符串。

+0

感謝Magoo。你的代碼比我的簡潔得多,只需稍作調整,運行速度就會快得多。 – 2015-02-24 16:13:33