FOR循环将每个迭代在同一行中用相同的前缀分组

我以一个练习题为例,将其作为一个练习来讨论: 合并pdf文件和相关的文件名

在这个问题上,我试图回答部分成功,因为它已经用更多的信息更新了这个问题。

总结这个问题是一个包含以下内容的文件夹:

123456_ABCD.pdf 123456_EFGH.pdf 123456_IJKL.pdf 111111_ABCD.pdf 111111_EFGH.pdf 222222_IJKL.pdf 222222_WXYZ.pdf 

而在一个命令我想得到这样的输出:

 123456_ABCD.pdf, 123456_EFGH.pdf, 123456_IJKL.pdf 111111_ABCD.pdf, 111111_EFGH.pdf 222222_IJKL.pdf, 222222_WXYZ.pdf 

这里的每一行都假设代表在命令中find的相同前缀

这是我的尝试:

 @echo off ( copy nul 123456_ABCD.pdf copy nul 123456_EFGH.pdf copy nul 123456_IJKL.pdf copy nul 111111_ABCD.pdf copy nul 111111_EFGH.pdf copy nul 222222_IJKL.pdf copy nul 222222_WXYZ.pdf ) setlocal enabledelayedexpansion :: set _pdffiles= set _prevfiles= for /f "delims=" %%i in ('dir /b /ad /o:n "??????_????.pdf"') do ( set "files=%%nxi" if "!files:~0,6!" neq "!_prevfiles:~0,6!" ( set "_prevfiles=%%i" set _pdffiles=!_pdffiles! "%%i" set "_outputpdf=%%~ni" ) else ( set _prevfiles= set _pdffiles= ) echo pdftk.exe !_pdffiles! cat output "!_outputpdf:~0,6!.pdf" ) 

但是,这给了我输出:

 pdftk.exe "111111_ABCD.pdf" cat output "111111.pdf" pdftk.exe "111111_ABCD.pdf" "111111_EFGH.pdf" cat output "111111.pdf" pdftk.exe "111111_ABCD.pdf" "111111_EFGH.pdf" "123456_ABCD.pdf" cat output "123456.pdf" pdftk.exe "111111_ABCD.pdf" "111111_EFGH.pdf" "123456_ABCD.pdf" "123456_EFGH.pdf" cat output "123456.pdf" pdftk.exe "111111_ABCD.pdf" "111111_EFGH.pdf" "123456_ABCD.pdf" "123456_EFGH.pdf" "123456_IJKL.pdf" cat output "123456.pdf" pdftk.exe "111111_ABCD.pdf" "111111_EFGH.pdf" "123456_ABCD.pdf" "123456_EFGH.pdf" "123456_IJKL.pdf" "222222_IJKL.pdf" cat output "222222.pdf" pdftk.exe "111111_ABCD.pdf" "111111_EFGH.pdf" "123456_ABCD.pdf" "123456_EFGH.pdf" "123456_IJKL.pdf" "222222_IJKL.pdf" "222222_WXYZ.pdf" cat output "222222.pdf" 

我search了类似的例子,但我还没有find如何避免这种情况。

PS:如果有人可以find一个伟大的标题build议,请:)

Solutions Collecting From Web of "FOR循环将每个迭代在同一行中用相同的前缀分组"

 echo off setlocal EnableDelayedExpansion set "list=" for /F "tokens=1,2 delims=_" %%a in ('dir /B *.pdf') do ( if "!last!" neq "%%a" ( if defined list echo pdftk.exe !list:~2! set "list=" set "last=%%a" ) set "list=!list!, %%a_%%b" ) echo pdftk.exe !list:~2! 

如果我理解你的话,你只能在一个组的最后执行pdftk.exe

编辑:此外,我已经加入~set files ,否定你的if并区分名称和路径。 现在看起来像你想要的。

 set name= set file= set pdfFiles= set prevFile= for /f "delims=" %%i in ('dir /b /s /ad /o:n "??????_????.pdf"') do ( set prevName=!name! set prevFile=!file! set name=%%~nxi set file="%%i" if "!prevName!" == "" set prevName=!name! if "!name:~0,6!" == "!prevName:~0,6!" ( set pdfFiles=!pdfFiles! !file! set _outputpdf=%%~ni ) else ( echo pdftk.exe !pdfFiles! cat output "!_outputpdf:~0,6!.pdf" set pdfFiles=!file! ) ) echo pdftk.exe %pdfFiles% cat output "%_outputpdf:~0,6%.pdf"