Batch file 使用通过不同文件传递的前缀的特定文件名列表创建文件

Batch file 使用通过不同文件传递的前缀的特定文件名列表创建文件,batch-file,Batch File,我正在寻找一个windows批处理程序,它读取一个包含文件名前缀的列表文件,然后将这些匹配的文件名放入另一个列表文件中。我不知道这是否可以通过windows批处理命令实现。下面是我想做的一个例子 Test.lst 11145 11361 23567 目录C:\input中的文件 11145_第1.tif页 11145_第2.tif页 11361.tif 235671_第1.tif页 235671_第2.tif页 235671_第3.tif页 输出应为: 11145.lst 11145_第1.

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

Test.lst


11145

11361

23567

目录C:\input中的文件


11145_第1.tif页

11145_第2.tif页

11361.tif

235671_第1.tif页

235671_第2.tif页

235671_第3.tif页

输出应为:

11145.lst 11145_第1.tif页

11145_第2.tif页

11361.lst 11361.tif

23567.lst 235671_第1.tif页

235671_第2.tif页

235671_Page3.tif

试试这个:

@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


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

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

用于(test.lst)do dir中的/f%a/b%a*.tif>%a.lst

@ECHO OFF
SETLOCAL
设置“sourcedir=U:\sourcedir”
设置“destdir=U:\destdir”
::
::此行只是在测试环境中设置文件
::
对于(11145_Page1.tif 11145_Page2.tif 11361.tif 235671_Page1.tif 235671_Page2.tif 12345_junk.tif 235671_Page3.tif)中的%%a,请复制NUL“%sourcedir%\%a”>NUL 2>NUL
对于(q22988667.txt)中的/f%%a,请执行以下操作(
对于('dir/b/a-d”%sourcedir%\%%a*.tif“')中的/f%%c,执行ECHO(%%c)>%destdir%\%%a.lst
后藤:EOF
我使用了一个名为
q22988667.txt
的文件,其中包含用于测试的数据。55a的第一行
只是在我的测试系统上设置了一些虚拟文件,与核心功能无关

不用说,如果您在前缀列表文件中输入
23
作为
2356
的补充,那么以
23
开头的所有文件都将列在
23.lst
中,包括
2356.lst
中的条目


@ECHO关闭
SETLOCAL
设置“sourcedir=U:\sourcedir”
设置“destdir=U:\destdir”
::
::此行只是在测试环境中设置文件
::
对于(11145_Page1.tif 11145_Page2.tif 11361.tif 235671_Page1.tif 235671_Page2.tif 12345_junk.tif 235671_Page3.tif)中的%%a,请复制NUL“%sourcedir%\%a”>NUL 2>NUL
对于('sort/r q22988667.txt')中的/f%%a,请执行以下操作(
(对于('dir/b/a-d”%sourcedir%\%%a*.tif“')中的/f%%c,执行回显(%%c)>%destdir%\%%a.lst”
对于('dir/b/a-d”%destdir%\%%a*.lst“')中的/f%%c,如果/i不是“%%c”==“%%a.lst”(
FINDSTR/v/x/g:“%destdir%\%%c”“%destdir%\tempfile.txt”
移动/y“%destdir%\tempfile.txt”“%destdir%\%%a.lst”>NUL
)
)
后藤:eof
修订版

通过按相反顺序对前缀名称列表进行排序,较长的名称将在较短的行之前进行处理,较短的行是较长行的截断版本。然后所需的是,较长的
.lst
文件中出现的任何名称都将从较短的
.lst
文件中删除,这可以通过
查找轻松完成tr/v/x
插入临时文件,并使用
移动
覆盖原始较短的命名文件


因此,将首先处理
2356
,然后再处理
23
。在
23
处理中,检测到
2356.lst
的存在,并通过tempfile将
2356.lst
的内容从
23.lst
中删除。

如果切换到大多数VER附带的powershell,您会发现这会容易得多不幸的是,我对powershell一无所知。如果您想执行这些复杂的批处理操作,值得花时间学习。正如我前面所问的,它工作得非常好。是否有任何方法可以扩展它,例如在同一个命令中查找23.tif和23_1.tif之类的内容。这样它就不会如前所述,写出以23开头的任何内容。