Batch file 仅将文件从第一级子文件夹复制到其他位置

Batch file 仅将文件从第一级子文件夹复制到其他位置,batch-file,cmd,robocopy,Batch File,Cmd,Robocopy,我只想将第二级子文件夹中的所有文件复制到其他位置。所有文件名都是唯一的。本例中的第二级子文件夹为01102009、05302009和09012010。例如: C:\test\ 2009\ 01102009\ file123.A09 file567.B07 05302009\ fileabc.A09 filexyz.A09 ThirdLevelSubFolder\ fileBLAH.B10

我只想将第二级子文件夹中的所有文件复制到其他位置。所有文件名都是唯一的。本例中的第二级子文件夹为01102009、05302009和09012010。例如:

C:\test\
  2009\
    01102009\
       file123.A09
       file567.B07
    05302009\
       fileabc.A09
       filexyz.A09
       ThirdLevelSubFolder\
          fileBLAH.B10
  2010\
     09012010\
        fileHello.A08
        fileBye.B10
  etc.
应返回:

C:\final\
   file123.A09
   file567.B07
   fileabc.A09
   filexyz.A09
   fileHello.A08
   fileBye.B10
请注意,它没有复制第三级子文件夹中的fileBLAH.B10

如果有帮助,所有文件都以.A###或.B##结尾,其中##是两位数

我试过这个:

robocopy "C:\test" "C:\final" s /LEV:2 
但它会复制第二级文件夹(例如01102009)和其中的文件。我只想要这些文件

我还尝试:

for /r "C:\test" %i in (*.*) do copy "%~fi" "C:\final" 

但这会复制所有子文件夹中的文件,包括第三级子文件夹,而我只需要第二级子文件夹中的文件。

根据foxidrive的注释进行最终编辑。您需要两个嵌套循环来处理第二级子文件夹中的文件(尽管aschipfl的解决方案具有以下功能):

原始答案

用于/r
=;在中尝试(不递归)
dir/B
FOR/F
=改为如下所示:

for /F "delims=" %i in ('dir /B /A:D "C:\test\*.*"') do copy /B "C:\test\%~i\*.*" "C:\final\*.*" 2>NUL
请注意,
2>NUL
阻止显示
消息,如果源文件夹为空,则系统无法找到指定的文件

输出(将
C:\
更改为
D:\
):第一个
dir/B
显示我们开始时目标文件夹为空,而最后一个
dir/B
显示目标填充了复制的文件

d:\bat>dir /B "d:\final\*.*"

d:\bat>for /F "delims=" %i in ('dir /B /A:D "d:\test\*.*"') do @copy /B /Y "d:\test\%~i\*.*" "d:\final\*.*" 2>NUL
d:\test\31441809\ttt.txt
        1 file(s) copied.
d:\test\ProcMon\LogfileAcrord32Start.CSV
d:\test\ProcMon\LogfileIE.CSV
d:\test\ProcMon\LogfileIEStart.CSV
d:\test\ProcMon\LogfileSwriter.CSV
d:\test\ProcMon\LogfileSwriterStart.CSV
        5 file(s) copied.
d:\test\ScreenCaptures\*.*
        0 file(s) copied.
d:\test\set\HKCU.txt
d:\test\set\hklm.txt
d:\test\set\regs.txt
d:\test\set\set.txt
d:\test\set\t!exclam!t.txt
        5 file(s) copied.

d:\bat>dir /B "d:\final\*.*"
HKCU.txt
hklm.txt
LogfileAcrord32Start.CSV
LogfileIE.CSV
LogfileIEStart.CSV
LogfileSwriter.CSV
LogfileSwriterStart.CSV
regs.txt
set.txt
t!exclam!t.txt
ttt.txt

d:\bat>

诀窍是两个嵌套的
for/D
循环,每个循环覆盖特定的目录层次结构级别:

@echo off
for /D %%A in ("C:\test\*") do (
  for /D %%B in ("%%~fA\*") do (
    xcopy /L /I "%%~fB\*.*" "C:\final"
  )
)
这段代码实际上并没有复制任何东西,它只是列出了要复制的内容;要启用复制,请从
xcopy
中删除
/L
开关

脚本不会根据模式
*.A???
*.B???
进行过滤;如果要执行此操作,需要两个
xcopy
命令。
此外,它不会从第一个目录级别复制任何内容,因为您的示例列表中没有显示任何文件


修正案:
当我谈论目录级别时,我参考以下定义:

所有级别都是相对于根位置进行编号的
C:\test\
,因此
2009\
是第一级,
01102009\
是第二级,依此类推。

当我在cmd提示符下输入您的命令时,全部作为一行,并点击enter,它生成了六行输出(C:\test中的每个第一级子文件夹一行)(例如,2009年、2010年……等等)但对于每一行,它都表示
0个文件抄袭了
@Larry这里的代码很好用-你有正确的路径和文件放在正确的地方吗?@Larry我明白你的问题-你要求的是二级文件,但实际上是三级文件。
c:\test
是第一级。Larry,你在问题标题中使用了
一级
二级
D描述,在这里实际上是一个第三级文件夹C:\test \\\\\\ 01102009有一个第三级文件夹,叫做“代码>第三级子文件夹”第二级文件夹<代码> 05302009 /代码>,但是我想如果我考虑“测试”第一级文件夹,那么实际上我有四个级别<代码>(例如,C:\test \ 2009 \ 05302009 \ CurdLealSub文件夹)
。这也起到了作用。我花了一些时间研究如何实现它(我一生中可能使用过一次cmd提示符)。我第一次尝试将所有内容作为一行输入,结果得到“%%A此时出乎意料。”Google search建议将其作为批处理程序运行。也必须查找该批处理程序。因此,对于新手来说,运行aschipfl代码的方法是:1)将其代码复制到记事本中,2)将文件以.bat扩展名(例如,“copyfiles.bat”)保存到任何你想要的地方,3)双击文件,它将执行代码。您可以将其作为一行输入命令提示符(您可以省略
@echo off
部分),但需要将所有
%%
替换为
%%
(这也记录在
for
命令的帮助文本中--在命令提示符中键入
for/?
)。
@echo off
for /D %%A in ("C:\test\*") do (
  for /D %%B in ("%%~fA\*") do (
    xcopy /L /I "%%~fB\*.*" "C:\final"
  )
)