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

标签 windows batch-file for-loop cmd

我以我觉得有趣的问题为例:Merge pdf files with related filenames

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

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

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

在命令 FOR 中,我想得到这样的输出:

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

这里的每一行都应该代表在命令 for

中找到的相同前缀

这是我尝试过的:

@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 /a-d /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"

我搜索了类似的例子,但我还没有找到如何避免这种情况。

ps:如果有人能找到好的标题建议,请 :)

最佳答案

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!

关于windows - FOR 循环将每次迭代用相同的前缀分组在一行中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32823742/

相关文章:

python - 如何使用字符串列表上的枚举来测试/运行循环的最后一次迭代

android - ADB 驱动程序和 Windows 8.1

windows - 在本地网络上运行 git 服务器

c++ - 通过 IIS 应用程序池 w3wp.exe 调用 COM DLL 时未调用 DLL_THREAD_ATTACH

windows - 在 for 循环中查找和替换 [批处理脚本]

batch-file - 如何在批处理脚本中增加循环变量?

javascript - 如果 for 循环返回 null javascript

windows - 在批处理脚本中,如何获取文件的长名称?

mysql - mysql从批处理文件安装

javascript - For循环(Java脚本),为什么只有一次输出,而不是循环迭代的次数?