创建一个文件,其中包含通过不同文件传递的前缀的特定文件名列表

时间:2014-04-10 12:53:21

标签: batch-file

我正在寻找一个Windows批处理程序,它读取包含文件名前缀的列表文件,然后将这些匹配的文件名放入另一个列表文件中。我不知道这是否可以通过Windows批处理命令。以下是我要做的一个例子。

Test.lst


11145

11361

23567

目录C:\ input

中的文件

11145_Page1.tif

11145_Page2.tif

11361.tif

235671_Page1.tif

235671_Page2.tif

235671_Page3.tif

输出应为:

11145.lst

11145_Page1.tif

11145_Page2.tif

11361.lst

11361.tif

23567.l​​st

235671_Page1.tif

235671_Page2.tif

235671_Page3.tif

3 个答案:

答案 0 :(得分:1)

这相当简单,但为您的测试用例提供了正确的结果 (应该直接从命令行运行):

for /f %a in (test.lst) do dir /b %a*.tif >%a.lst

答案 1 :(得分:0)

试试这个:

@echo off
for /f "delims=" %%a in ('type "test.lst"') do (
dir "c:\input\*.tif" | find "%%a" && echo %%a.lst>>New_List_File.lst || echo %%a not found)

这将创建具有匹配值的文件New_List_File.lst

这是一个你可以轻松适应你的问题的想法。

答案 2 :(得分:0)

@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "destdir=U:\destdir"

::
:: This line is merely setting up the files in a test environment
::
FOR %%a IN (11145_Page1.tif 11145_Page2.tif 11361.tif 235671_Page1.tif 235671_Page2.tif 12345_junk.tif 235671_Page3.tif) DO COPY NUL "%sourcedir%\%%a" >NUL 2>nul


FOR /f %%a IN (q22988667.txt) DO (
 FOR /f %%c IN ('dir /b /a-d "%sourcedir%\%%a*.tif"') DO ECHO(%%c)>"%destdir%\%%a.lst

GOTO :EOF

我使用了一个名为q22988667.txt的文件,其中包含我的测试数据。第一个for 55a行只是在我的测试系统上设置一些虚拟文件,与核心功能无关。

毋庸置疑,如果您在前缀列表文件中23添加2356,那么所有23开头的文件都会列在23.lst中 - 包括2356.lst中的条目。


@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "destdir=U:\destdir"

::
:: This line is merely setting up the files in a test environment
::
FOR %%a IN (11145_Page1.tif 11145_Page2.tif 23.tif 11361.tif 235671_Page1.tif 235671_Page2.tif 12345_junk.tif 235671_Page3.tif) DO COPY NUL "%sourcedir%\%%a" >NUL 2>nul


FOR /f %%a IN ('sort /r q22988667.txt') DO (
 (FOR /f %%c IN ('dir /b /a-d "%sourcedir%\%%a*.tif"') DO ECHO(%%c)>"%destdir%\%%a.lst"
 FOR /f %%c IN ('dir /b /a-d "%destdir%\%%a*.lst"') DO IF /i NOT "%%c"=="%%a.lst" (
  FINDSTR /v /x /g:"%destdir%\%%c" <"%destdir%\%%a.lst" >"%destdir%\tempfile.txt"
  MOVE /y "%destdir%\tempfile.txt" "%destdir%\%%a.lst" >NUL 
 )
)
GOTO :eof

修订版。

通过按相反的顺序对前缀名称列表进行排序,在较长的行之前处理较长的名称,这是较长行的截断版本。然后需要的是,名称较长的.lst文件中出现的任何名称都从名称较短的.lst中删除 - 使用findstr /v /x轻松完成到临时文件中并使用{{1覆盖原始的命名较短的文件。

因此,move将首先处理,2356稍后处理。在23处理中,检测到23的存在,并通过临时文件从2356.lst中删除2356.lst的内容。