【问题标题】:Batch file to copy the first PDF in multiple folders from c:\pdf\ to single folder c:\qa\批处理文件将多个文件夹中的第一个 PDF 从 c:\pdf\ 复制到单个文件夹 c:\qa\
【发布时间】:2017-03-05 20:26:39
【问题描述】:

我有数百个来自 c:\pdf\ 文件夹的子文件夹。

我想获取每个子文件夹中的第一个 pdf(按名称排序)并将它们复制到一个文件夹中,例如 c:\QA\,以便我可以手动检查 PDF 是否有错误。

有人可以帮忙吗?请!

到目前为止我有这个:

@echo off
cls
cd c:
cd c:\pdf\
for /r %%a in (*.pdf) do (
    copy %%a c:\qa\%%~nxa
    GOTO :EXIT
)
:Exit

注意文件名是唯一的。目标目录永远不是源的子目录。 baove 代码适用于子文件夹中的第一个 pdf,但不适用于其余的子文件夹。

【问题讨论】:

  • 我们很乐意为您提供帮助,如果您创建了一个批处理文件,尝试过它并将其发布在此处,并说明您在哪里遇到了困难。
  • Compo,感谢您的评论。不幸的是,我不以编程为生。我对批处理文件的了解仅限于为 a 重命名和复制某个文件到 b,但不使用循环等。抱歉,我无法提供基本信息!
  • 那不是有效的代码,也请用您的代码编辑您的原始帖子。

标签: batch-file pdf automation


【解决方案1】:

新技术文件系统 (NTFS) 返回与通配符模式匹配的文件名列表,该通配符模式始终按字母顺序排序。因此,对于 NTFS 格式的分区,以下批处理代码可能足以完成此任务。

@echo off
for /D %%D in ("C:\pdf\*") do if exist "%%D\*.pdf" call :CopyFirstFile "%%D"
goto :EOF

:CopyFirstFile
for %%F in ("%~1\*.pdf") do (
    copy "%%F" C:\qa\
    goto :EOF
)
goto :EOF

请注意,第一个 FOR 会忽略具有隐藏属性集的子文件夹。而子程序CopyFirstFile 中的第二个FOR 会忽略具有隐藏属性集的PDF 文件。

另一种适用于文件分配表 (FAT) 分区(FAT16、FAT32、exFAT)的解决方案使用命令 DIR 来获取按名称排序的 *.pdf 文件列表。

@echo off
for /D %%D in ("C:\pdf\*") do if exist "%%D\*.pdf" call :CopyFirstFile "%%D"
goto :EOF

:CopyFirstFile
for /F "delims=" %%F in ('dir /A-D /B /ON "%~1\*.pdf"') do (
    copy "%~1\%%F" C:\qa\
    goto :EOF
)
goto :EOF

命令 DIR 会忽略匹配模式 *.pdf 的目录,并且还会发现隐藏的 *.pdf 文件,因为选项 /A-D。但 COPY 不会复制隐藏的 *.pdf 文件!

使用 MOVE 而不是 COPY 可能会更好,因为在下次运行时,如果 C:\pdf 中的文件夹不存在,批处理文件将再次复制相同的文件同时修改。

标签CopyFirstFile下面的命令行被解释为第一个FOR循环调用的子程序。

一旦第一个 FOR 循环遍历 C:\pdf 的所有非隐藏子目录完成,第一个 goto :EOF 将退出批处理文件处理。

第二个goto :EOF 在复制目录中找到的第一个文件后退出第二个FOR 循环和子例程,该文件作为第一个(也是唯一一个)参数传递给子例程。

第三个goto :EOF 并不是真正需要的,因为这个命令行不应该被执行,而且当批处理文件中没有更多的命令行时也不需要。但最好的做法是确保作为子例程调用的每个块的最后一行都有goto :EOFexit /B,这与goto :EOF 完全相同。

要了解所使用的命令及其工作原理,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读每个命令显示的所有帮助页面。

  • call /?
  • copy /?
  • dir /?
  • echo /?
  • for /?
  • goto /?
  • if /?

【讨论】:

    【解决方案2】:

    这里有一些示例代码供您参考。它查看每个目录和C:\PDF 下的任何潜在子目录,它不查看C:\PDF 内的文件。如果您正在寻找不同的东西,请相应地更新您的问题。

    @Echo Off
    For /D /R "C:\PDF" %%A In (*) Do (
        For /F "Delims=" %%B In ('Dir/B/A-D/O-N "%%A\*.pdf" 2^>Nul') Do (
            Set "first=%%A\%%B")
        SetLocal EnableDelayedExpansion
        If Exist "!first!" Copy "!first!" "C:\QA"
        EndLocal)
    Pause
    

    请不要只使用它,还要花时间通过查看各种参考资料来学习它

    【讨论】:

      【解决方案3】:

      您需要做的就是结合 Dir & For 的功能。现在,您可以简单地分析代码并根据需要进行修改。

      代码提示:

      CD /D "C:\PDF"
      DIR /s /b *.pdf >a.txt
      For /f "Tokens=*" %%A In (a.txt) Do (Copy /Y "%%A" "C:\QA")
      Exit
      

      而且,这几乎是您所需要的。 :)

      【讨论】:

        猜你喜欢
        • 2010-11-02
        • 2014-03-21
        • 1970-01-01
        • 2021-10-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-27
        • 1970-01-01
        相关资源
        最近更新 更多