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

Extract date from XML file and move file to directory created from date

我有一个包含近百万 XML 个文件的目录。不用说,加载需要很长时间(20 多分钟)所以,我正在编写一个脚本,将文件分成文件夹,顶层是年份,每年有几个月。有 4 个主要文件名,其中日期可以从第三个标记中提取,其余的从第二个标记中提取。即:

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 

问题是变量标记没有返回正确的数字,我不确定为什么。任何建议表示赞赏。

@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 命令仅 ECHOed 用于测试目的。 确认命令正确后,将ECHO(MD更改为MD以实际创建目录。附加 2>nul 以抑制错误消息(例如,当目录已经存在时)

所需的 MOVE 命令仅 ECHOed 用于测试目的。 确认命令正确后,将ECHO(MOVE 更改为MOVE 以实际移动文件。附加 >nul 以禁止报告消息(例如 1 file moved

简单地提取两个可能的日期字符串,并使用第六个标记的存在来指示两个位置中的哪一个到 select 以生成目标目录。如果没有第三个标记则跳过(不适合指定的掩码)

然后 select 将必填字段 date1 并进行一些子字符串处理。