在包含日期的文件之间提取文件名

时间:2015-08-14 14:29:47

标签: batch-file cmd

这有点令人费解,但我会尽我所能解释。我需要提取文件名中和最新文件名之后具有相同日期的2个文件之间的所有文件名。到目前为止,这是我非常稀疏的代码,用于提取第一个文件:

@echo off
setlocal

pushd \\server1.com\developer\inetpub\Ftproot\XMLs
echo.
for /f "tokens=2 delims=_" %%a in ('dir /b /o-d ABC*.xml') do (
    for /f %%b in ('dir /b /o-d ABC*%%a*.xml') do (echo %%~b - %%~tb &&goto:out)
)
:out
popd

这只是在目录中找到最新的ABC xml文件。现在我需要找到第二个最新的并列出第二个最新的ABC xmls和最新的ABC xml文件之后的所有文件之间的所有文件。

我无法为此做一个dir列表,因为即使是一小部分也会有数百个文件。这是我期望返回的一小部分。

08/20/2015  05:50 PM             8,829 BC6009490001_ACCTV21_20150820_CHG_367_107431247A.xml
08/20/2015  05:50 PM            11,552 BC6009490001_BALMIS_20150820_CHG_367_107432647B.xml
08/20/2015  05:49 PM               679 ABC_20150820_107481745D.xml
08/20/2015  05:48 PM             7,647 ID1779750001_BALMIS_20150820_NAC_5_1074336956.xml
08/20/2015  05:48 PM             7,650 ID1779740001_BALMIS_20150820_NAC_5_107447244U.xml
08/20/2015  05:48 PM             7,604 ID1778730001_BALMIS_20150820_NAC_5_107434944I.xml
08/20/2015  05:48 PM             7,786 ID1808430001_BALMIS_20150820_NAC_2_1074206446.xml
08/20/2015  05:43 PM             8,911 SB1522960001_ACCTV21_20150820_EXT_3_107249691J.xml
08/20/2015  05:43 PM             6,141 SB1522960001_BALMIS_20150820_EXT_3_107400191K.xml
08/20/2015  05:43 PM               623 ABC_20150820_1074331234.xml

所以,我可以轻松找到最新的ABC * .xml文件,但我希望得到5:43以及它上面的所有内容。必须从文件名中提取搜索日期,因为有时它与日期dir返回不同。

1 个答案:

答案 0 :(得分:0)

所以,起初我想出了这个:

@echo off 
setlocal enabledelayedexpansion

set "found=0"
pushd \\server1\developer\inetpub\Ftproot\XMLs
echo.
for /f "tokens=1,2 delims=[]" %%a in (
  'dir /b /o:-d *.xml^|find /i /n /v "^"'
 ) do ( 
  set "f3=%%b"
  IF "!f3:~0,3!" EQU "ABC" set /a "found+=1"
  IF "!found!" EQU "2" (
        Echo %%b
        Echo %%a Files Total
        Goto :out
     ) ELSE ( 
        echo %%b
  )
 )
:out
popd

它运作得很好,但速度很慢。我记得在一个for循环中听到dir的问题,它必须在它开始之前迭代整个目录并且需要32,000个文件,这需要一段时间。所以,我在dostips论坛上发布了它,在foxidrive的帮助下,我想出了这个:

@echo off
dir /b /o:-d "\\server1\developer\inetpub\Ftproot\XMLs\*.xml" >"%temp%\filterABC.tmp"
set "found="
set "files="
setlocal enabledelayedexpansion
(
for /f "usebackq delims=" %%a in ("%temp%\filterABC.tmp") do (
      set "f3=%%a"
      echo %%a
      set /a files+=1
      IF /i "!f3:~0,3!" EQU "ABC" IF defined found goto :out
      IF /i "!f3:~0,3!" EQU "ABC" set "found=1"
   )
)>"%temp%\filterABC2.tmp"
:out
echo located !files! files in total
notepad "%temp%\filterABC2.tmp"
del "%temp%\filterABC.tmp"

现在它工作得很好。