Batch file 仅将文件从第一级子文件夹复制到其他位置
我只想将第二级子文件夹中的所有文件复制到其他位置。所有文件名都是唯一的。本例中的第二级子文件夹为01102009、05302009和09012010。例如: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
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"
)
)