从XML文件中提取日期并将文件移动到从日期创建的目录

时间:2015-02-24 15:02:01

标签: batch-file

我有一个包含近百万个XML文件的目录。毋庸置疑,它需要永远加载(20多分钟)因此,我正在编写一个脚本来将文件分成文件夹,最高级别是年份,每年都有几个月。有4个主文件名,其中日期可以从第3个令牌中提取,其余的可以从第二个令牌中提取。即:

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 个答案:

答案 0 :(得分: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

只需提取两个可能的日期字符串,并使用第六个标记的存在来指示要选择哪两个位置来生成目标目录。如果没有第三个令牌(无法适应指定的掩码),则跳过

然后选择date1所需的字段并进行子字符串处理。