Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.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
Parsing 将1个文件从多个子目录复制到另一个目录_Parsing_Batch File_Copy_Subdirectory_Enumerate - Fatal编程技术网

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

Parsing 将1个文件从多个子目录复制到另一个目录,parsing,batch-file,copy,subdirectory,enumerate,Parsing,Batch File,Copy,Subdirectory,Enumerate,我在谷歌和论坛上搜索了好几天,试图找出如何构建一个批处理文件,该批处理文件将解析一个目录树,并将每个子目录中的一个文件复制到一个新文件夹中 我有一个线索: 而这个。。。 我试过这个: @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 暂停之

我在谷歌和论坛上搜索了好几天,试图找出如何构建一个批处理文件,该批处理文件将解析一个目录树,并将每个子目录中的一个文件复制到一个新文件夹中

我有一个线索:

而这个。。。

我试过这个:

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


我知道我的要求很高,希望这里的一些天才能够帮助一个刚接触编程的孩子。

问题1-您无法使用/R选项。根目录应该跟随/R选项,文件过滤器应该出现在in()子句中。通过在命令行中键入
FOR/?
来阅读以获取帮助

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

@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
)
问题3-您需要跳过目标目录,因为它是根目录的子目录

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

为了解决这个问题,您需要让第一个循环调用包含第二个循环的子例程。然后,您可以退出/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
)

谢谢你,德本汉姆!你有没有可能尝试一下下面关于文件被覆盖的新问题?@user1205701如果这个答案对你有帮助,你应该接受并投赞成票。