Board logo

标题: [文件操作] 批处理怎样把子目录的文件移动到当前目录并删掉子目录? [打印本页]

作者: zcdyj    时间: 2011-4-30 10:54     标题: 批处理怎样把子目录的文件移动到当前目录并删掉子目录?

本帖最后由 zcdyj 于 2011-5-1 21:25 编辑

比如有一个1的文件夹 里边有一个2的文件夹 我想把用批处理把2的文件夹里的文件和文件夹移动到1的文件夹 并且不破坏文件夹结构
下面这个代码 会破坏文件夹结构
  1. @echo off
  2. attrib -s -h -r -a
  3. for /f "delims=" %%i in ('dir /a:-d/b/s') do ( move /y "%%i" "%cd%" )
  4. for /f "delims=" %%j in ('dir /a:d/b') do ( RD /s/q "%%j" )
  5. exit
复制代码
请问该如何修改使得可以把2文件夹里的文件和文件夹完整的移动到1的文件夹 并删除2文件夹?
TEST http://u.115.com/file/t28d6934d6
批处理后的效果 http://u.115.com/file/t2e35d35a3

1和2的文件夹是任意举例的 因为有很多都需要这样改 想弄个通用的代码
绝对路径每次都要改 有点繁琐  使用相对路径是最好的

以上的使用 liaobiaoxing 的代码成功了
echo d|xcopy /s /h /k .\2 .\ /ey
rd /s /q 2
再请教一个问题 如何指定一个文件夹 让该文件夹运行上面这段代码
例如我有一个123456的文件夹 里面有1文件夹 1文件夹里面有2文件夹  里面有3文件夹 3文件夹里面有4文件夹
也就是如何遍历123456的所有子文件夹 让所有的子文件夹实现上面的那个代码?
保留目录结构 我想实现的功能和上面一样 这次是对一个大文件夹下的所有子文件夹批量操作 使得子文件夹里的子文件里头的文件夹和文件移动到子文件夹里

TEST2 http://u.115.com/file/t21ef225df
批处理后的效果 http://u.115.com/file/t2f0e406b2
也就是在123456的文件夹中保持123456文件夹中的一级目录文件夹名的基础上把二级目录的东东移动到一级目录 并把二级目录的文件夹删除
作者: CrLf    时间: 2011-4-30 11:30

  1. @echo off
  2. attrib -s -h -r -a
  3. for /d %%a in (*) do (
  4.    for /f "delims=" %%b in ('dir /a /b "%%a\"') do move /y "%%b" .\
  5.    rd "%%a"
  6. )
复制代码

作者: applba    时间: 2011-4-30 11:47

本帖最后由 applba 于 2011-4-30 11:49 编辑

楼主把move换成xcopy /s试试,可以递归复制子目录和文件的。

用xcopy后直接用for 或者for /d 就可以了,用不上for  /f
作者: CrLf    时间: 2011-4-30 11:53

1、xcopy确实更好,忘了用...
2、用for /f是为了兼容隐藏文件
作者: applba    时间: 2011-4-30 12:09

4# zm900612


隐藏文件不怕,attrib -r -s -h先跑一遍
作者: zcdyj    时间: 2011-4-30 12:54

先谢谢了 可还是不行 会破坏文件夹结构
作者: liaobiaoxing    时间: 2011-4-30 13:35

本帖最后由 liaobiaoxing 于 2011-4-30 13:43 编辑

xcopy 本来就带有复制隐藏文件并保留其属性的参数。不用麻烦attrib
我是在E盘下建了一个1的文件夹,1下面还有2的文件夹,里面有文件和文件夹。你跟踪情况自己改吧。
  1. echo d|xcopy /s /h /k e:\1\2 e:\1 /ey
  2. rd /s /q 2
复制代码

作者: zcdyj    时间: 2011-4-30 13:45

7# liaobiaoxing


感谢你的回复 我说的1和2的文件夹是任意举例的 因为有很多都需要这样改 有没有比较通用的代码?
作者: liaobiaoxing    时间: 2011-4-30 13:52

8# zcdyj


把e:\1 和e:\1\2换成变量不就是通用代码了吗?你可以对变量进行赋值之后进行操作。
作者: batman    时间: 2011-4-30 13:54

在1目录下执行
  1. @echo off
  2. xcopy /e /h /k /y 2 %cd%&rd /s /q 2
复制代码

作者: batman    时间: 2011-4-30 13:57

8# zcdyj
请将所有的要求更新在顶楼。。。
作者: zcdyj    时间: 2011-4-30 14:10

10# batman


谢谢版主 我运行了结果2文件夹直接被删掉了 能不能把2文件夹里的文件夹和文件先复制到1文件夹再删除自身?
作者: zcdyj    时间: 2011-4-30 14:17

9# liaobiaoxing


感谢liaobiaoxing的代码 我把路径改成相对路径后成功了
作者: zcdyj    时间: 2011-4-30 14:40

再请教一个问题 如何指定一个文件夹 让该文件夹运行上面这段代码
例如我有一个123456的文件夹 里面有1文件夹 1文件夹里面有2文件夹  里面有3文件夹 3文件夹里面有4文件夹
也就是如何遍历123456的所有子文件夹 让所有的子文件夹实现上面的那个代码?
作者: powerbat    时间: 2011-4-30 15:00

楼上的意思是去掉目录层次结构、把所有文件移动同一级目录下?
作者: zcdyj    时间: 2011-4-30 15:30

15# powerbat


不是 保留目录结构 我想实现的功能和上面一样 这次是对一个大文件夹下的所有子文件夹批量操作 使得子文件夹里的子文件里头的文件夹和文件移动到子文件夹里
作者: powerbat    时间: 2011-4-30 15:47

先复制再删除不太好,要创建新文件,如果文件很多很大,影响性能。
而本来Windows系统在同一个驱动器之间移动文件几乎没有什么操作,更不用创建新文件(当然不同驱动器之间移动确实是先复制再删除)。
不如用vbs
  1. folderPath = "E:\1"
  2. subfldName = "2"
  3. On Error Resume Next
  4. Set fso = CreateObject("Scripting.FileSystemObject")
  5. fso.MoveFile folderPath & "\" & subfldName & "\*", folderPath & "\"
  6. fso.MoveFolder folderPath & "\" & subfldName & "\*", folderPath & "\"
复制代码

作者: zcdyj    时间: 2011-5-1 10:47

本帖最后由 zcdyj 于 2011-5-1 10:55 编辑

17# powerbat


感谢powerbat的代码 VBS的思路很不错 你的代码改成相对路径怎么不成功啊?
如果我有一个123456的大文件夹 里面有很多的需要处理的1文件夹(任意名称的), 这样的VBS怎样修改?
作者: powerbat    时间: 2011-5-1 17:05

要使用相对路径把folderPath的值改成"."或其他正确的相对于脚本的路径
  1. folderPath = "E:\123456"
  2. On Error Resume Next
  3. Set fso = CreateObject("Scripting.FileSystemObject")
  4. Set Folders = fso.GetFolder(folderPath).SubFolders
  5. for each oFolder in Folders
  6.     fso.MoveFile oFolder.Path & "\*", folderPath & "\"
  7.     fso.MoveFolder oFolder.Path & "\*", folderPath & "\"
  8.     if 0=oFolder.Files.Count and 0=oFolder.SubFolders.Count then
  9.         oFolder.Delete true
  10.     else
  11.         WScript.Echo oFolder.Path & "中的某些文件(夹)移动失败"
  12.     end if
  13. next
  14. WScript.Echo "Done"
复制代码

作者: yjstone    时间: 2011-5-1 17:37

本帖最后由 yjstone 于 2011-5-1 22:21 编辑

将zm900612兄的代码修改一下就可以了,下面的代码在你给出的示例文件夹中测试通过,只要将代码分别放到示例文件夹123456里的1和3的文件夹里运行就OK了,并且具有通用性,只要你的文件结构符合你所说的要求就能行,而且两个要求都能符合(其实是一样的)。
  1. @echo off
  2. for /d %%a in (*) do (   
  3. for /f "delims=" %%b in ('dir /a /b "%%a"') do attrib -s -h "%%b"&&move /y "%%a\%%b" .\
  4. rd "%%a"
  5. )
  6. pause
复制代码

作者: zcdyj    时间: 2011-5-1 19:31

20# yjstone


恩 放在1和3的文件夹里测试通过 不知道为什么有个错误提示,我是想把它放在123456的文件夹里这样就不用在每个子目录都要放一个这样的文件了,不知这样该如何修改?
作者: yjstone    时间: 2011-5-1 21:02

本帖最后由 yjstone 于 2011-5-1 21:16 编辑

简单啦,把批处理放在123456文件夹,连续运行,每运行一次就会减少一级目录,直到你满意为止。至于错误提示估计是这一句:attrib -s -h %%a 。我忘记加双引号了,当遇到有空格的文件或文件夹时报错,已在原代码加上了。
作者: zcdyj    时间: 2011-5-1 21:24

22# yjstone


感谢yjstone 可能你误解了我的意思 我是想让保持一级目录文件夹名的基础上把二级目录的东东移动到一级目录 并把二级目录的文件夹删除
作者: yjstone    时间: 2011-5-1 22:19

本帖最后由 yjstone 于 2011-5-1 22:53 编辑

我估计你是想保留123456目录下的一级子目录下的目录和文件,然后在123456目录下运行批处理来达到上面你所说的目的吧,那试试下面的代码:
  1. @echo off
  2. for /d %%a in (*) do (
  3. pushd "%%a"
  4. for /d %%b in (*) do (   
  5. for /f "delims=" %%c in ('dir /a /b "%%b"') do attrib -s -h "%%c"&&move /y "%%b\%%c" .\
  6. rd "%%b"
  7. )
  8. popd
  9. )
  10. pause
复制代码

作者: zcdyj    时间: 2011-5-1 22:41

24# yjstone


恩 你的代码我测试了 完美实现我想要的功能 奇怪的是有个错误提示  提示 找不到文件 这个该如何修改?
作者: Batcher    时间: 2011-5-2 09:11

25# zcdyj


@echo off删掉,看看哪一步报错的。




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2