我正在寻找一个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_Page1.tif
11145_Page2.tif
11361.tif
235671_Page1.tif
235671_Page2.tif
235671_Page3.tif
答案 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
的内容。