我有一個包含近百萬個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
問題是變量令牌沒有返回正確的數字,我不知道爲什麼。任何建議感激。
感謝Magoo。你的代碼比我的簡潔得多,只需稍作調整,運行速度就會快得多。 – 2015-02-24 16:13:33