Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 批处理文件,将多个文件夹中的第一个PDF从c:\PDF\复制到单个文件夹c:\qa\_Batch File_Pdf_Automation - Fatal编程技术网

Batch file 批处理文件,将多个文件夹中的第一个PDF从c:\PDF\复制到单个文件夹c:\qa\

Batch file 批处理文件,将多个文件夹中的第一个PDF从c:\PDF\复制到单个文件夹c:\qa\,batch-file,pdf,automation,Batch File,Pdf,Automation,我有数百个子文件夹来自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代码适用于子文件夹中

我有数百个子文件夹来自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,但不适用于其他子文件夹。

以下是一些示例代码。它查看每个目录和
C:\PDF
下面的任何潜在子目录,而不查看
C:\PDF
中的文件。如果你在寻找不同的东西,那么相应地更新你的问题

@Echo关闭
对于(*)中的/D/R“C:\PDF”%%A,请执行以下操作(
对于/F“Delims=“%%B In('Dir/B/A-D/O-N”%%A\*.pdf“2^>Nul”)Do(
设置“第一个=%%A\%%B”)
SetLocal EnableDelayedExpansion
如果存在“!first!”复制“!first!”C:\QA”
(本地)
暂停

请不要只是使用它,还要通过检查各种引用来慢慢学习。

新技术文件系统(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
中的的第二个忽略设置了隐藏属性的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
由于选项
/A-D
,命令DIR忽略与模式*.pdf匹配的目录,并查找隐藏的*.pdf文件。但是,复制不会复制隐藏的*.pdf文件

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

label
CopyFirstFile
下面的命令行被解释为第一个FOR循环调用的子例程

第一个
goto:EOF
在第一个FOR循环遍历
C:\pdf
的所有非隐藏子目录后退出批处理文件处理

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

第三个
goto:EOF
实际上是不必要的,因为永远不应该执行此命令行,而且当批处理文件中没有更多命令行时,也不需要此命令行。但最好的做法是确保被称为子例程的每个块都有最后一行
goto:EOF
或与
goto:EOF
完全相同的
exit/B

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

  • 呼叫/?
  • 复制/?
  • dir/?
  • echo/?
  • 获取/?
  • goto/?
  • 如果/?

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

代码提示:


而且,它几乎是您所需要的全部。:)

我们很乐意提供帮助,当你创建了一个批处理文件,尝试了它,并将它发布在这里,并解释了你在哪里与它斗争。Compo,谢谢你的评论。不幸的是,我在挣扎,因为我不以编程为生。我对批处理文件的了解仅限于重命名和复制a到b的某个文件,而不是使用循环之类的方法。对不起,我不能提供基本的!这不是有效的代码,也请用您的代码编辑您的原始帖子。
CD /D "C:\PDF"
DIR /s /b *.pdf >a.txt
For /f "Tokens=*" %%A In (a.txt) Do (Copy /Y "%%A" "C:\QA")
Exit