0

我已经在 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

出现停顿是因为我试图弄清楚到底发生了什么。

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

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

4

1 回答 1

1

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

问题 2 - 您的循环将在第一次 GOTO 后中止,因此您最多只能从一个目录复制文件。

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

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

要解决这个问题,您需要让第一个循环调用包含第二个循环的子例程。然后,您可以从第二个循环中退出 /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
)
于 2012-02-13T02:31:17.823 回答