将1个文件从多个子目录复制到另一个目录

时间:2012-02-12 21:48:28

标签: parsing batch-file copy subdirectory enumerate

我搜索Google和论坛几天试图找出如何完成构建批处理文件的方法,该文件将解析目录树并将每个子目录中的1个文件复制到新文件夹。

我有这个领先优势: http://www.pcreview.co.uk/forums/can-copy-file-multiple-folders-t1959548.html

这...... https://stackoverflow.com/questions/1...in-a-directory

我试过这个:

@ECHO OFF
CLS
PAUSE
FOR /R %%A in (C:\Users\Liam\Desktop\Master) DO (   
COPY %%A  C:\Users\Liam\Desktop\Master\Master-Copies\
GOTO :Exit
)
:Exit
Pause

暂停存在是因为我正在试图弄清楚究竟发生了什么。

在我的“Master”目录中,大约有250个子目录。我想从每个子目录中复制一个文件,并将它们放在一个名为“Master-Copies”的新子目录中,该子目录最终应该有250个文件。子目录和文件的名称中没有空格,但是我想将该功能构建到批处理文件中以防我再次遇到这种情况。我想复制每个子目录中的第一个文件。我在阅读其他论坛时知道“FIRST”文件是相对的,但我希望它是按名称排序的第一个文件。

我知道我问了很多,希望这里的一些天才可以帮助一个刚接触编程的孩子。

1 个答案:

答案 0 :(得分:1)

问题1 - 你错过了使用/ R选项。根目录应遵循/ R选项,文件过滤器应出现在IN()子句中。从命令行键入FOR /?,阅读FOR帮助。

问题2 - 你的循环将在第一个GOTO之后中止,所以最多你会从一个目录中复制一个文件。

问题3 - 您需要跳过目标目录,因为它是根目录的子目录。

解决方案:您将需要2个循环,第一个从您的根开始遍历目录层次结构,第二个循环将列出单个目录中的文件。在复制第一个文件后,你需要从第二个循环中退出/ B或GOTO,但是如果第二个循环嵌入第一个循环中,这将不起作用 - 退出/ goto将退出最外面的循环。 / p>

要解决这个问题,你需要让第一个循环调用一个包含第二个循环的子程序。然后你可以从第二个循环中退出/ B,它将返回你的第一个循环并从它停止的地方继续。仅在目录与目标目录不匹配时才调用子例程。

@echo off
setlocal
set root="C:\Users\Liam\Desktop\Master"
set dest="C:\Users\Liam\Desktop\Master\Master-Copies\"
for /r /d %root% %%D in (*) do if "%%D" neq %dest% call :copyFirstFile "%%D"
pause
exit /b

:copyFirstFile
for %%F in ("%~1\*") do (
  copy "%%F" %dest%
  exit /b
)