新技术文件系统 (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 :EOF 或exit /B,这与goto :EOF 完全相同。
要了解所使用的命令及其工作原理,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读每个命令显示的所有帮助页面。
call /?
copy /?
dir /?
echo /?
for /?
goto /?
if /?