Batch file 使用通过不同文件传递的前缀的特定文件名列表创建文件
我正在寻找一个windows批处理程序,它读取一个包含文件名前缀的列表文件,然后将这些匹配的文件名放入另一个列表文件中。我不知道这是否可以通过windows批处理命令实现。下面是我想做的一个例子 Test.lstBatch 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.
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开头的任何内容。