Board logo

标题: [文件操作] 【已解决】批处理如何将指定子文件夹中的内容移动到上一级 [打印本页]

作者: lw121    时间: 2020-8-19 19:02     标题: 【已解决】批处理如何将指定子文件夹中的内容移动到上一级

本帖最后由 lw121 于 2020-8-21 22:51 编辑

c:\a\b\c2\111.png
c:\a\b2\c1\222.png
c:\a\b3\c\dd\444.png
c:\a\b4\c\dd\555.png
c:\a\b5\c3\ee\666.png
如何将子文件夹dd中的文件移动到上一级,并删除dd文件夹,其他的不变化
c:\a\b\c2\111.png
c:\a\b2\c1\222.png
c:\a\b3\c\444.png
c:\a\b4\c\555.png
c:\a\b5\c3\ee\666.png
作者: gzaapy    时间: 2020-8-20 08:15

move -y c:\a\b3\c\dd\444.png  c:\a\b3\c\
move -y c:\a\b4\c\dd\555.png  c:\a\b4\c\
rd /s /q  c:\a\b3\c\dd
rd /s /q  c:\a\b4\c\dd
作者: lw121    时间: 2020-8-20 09:38

回复 2# gzaapy


    很多文件,并不是只有四条......
作者: qixiaobin0715    时间: 2020-8-20 10:50

回复 3# lw121

请参考http://www.bathome.net/thread-56542-1-1.html
作者: lw121    时间: 2020-8-20 15:23

回复 4# qixiaobin0715


    我只需要移动指定子目录文件,其他同级的不变化
作者: qixiaobin0715    时间: 2020-8-20 15:33

回复 5# lw121

我的意思也是参考,自己改一下
  1. @echo off
  2. echo 当前目录为0级目录,下面子目录分别为1、2、3、...级目录。
  3. setlocal enabledelayedexpansion
  4. set /p "src=请输入要移动的目录层级数:"
  5. set /p "desc=请输入要移动到的目录层级数:"
  6. echo -----------------------
  7. set /a "up=%src%-%desc%"
  8. set /a "src=%src%-1"
  9. for /r %%i in (*) do (
  10. cd /d "%%~dpi"
  11. for /l %%a in (0,1,%src%) do cd..
  12. if "!cd!\"=="%~dp0" (
  13. echo 移动 %%i
  14. cd /d "%%~dpi"
  15. for /l %%a in (1,1,%up%) do cd..
  16. echo 移到 !cd!
  17. move /y "%%i" "!cd!" >nul && echo 成功 || echo 失败
  18. echo -------------------
  19. )
  20. )
  21. pause&exit
复制代码

作者: qixiaobin0715    时间: 2020-8-20 16:47

本帖最后由 qixiaobin0715 于 2020-8-20 16:48 编辑

理解有误,把下面代码放到C:\a中运行
  1. @echo off
  2. for /d /r %%i in (dd) do (
  3.   for %%a in ("%%i\*") do (
  4.     move /-y "%%a" "%%~dpa./../"
  5.   )
  6. )
  7. pause
复制代码

作者: WHY    时间: 2020-8-20 19:58

  1. @echo off
  2. REM 待删除的文件夹名
  3. set "folderName=qq"
  4. for /f "delims=" %%i in ('dir /b /ad /s "%folderName%"') do (
  5.     move "%%i\*" "%%i\..\"
  6.     rd "%%i"
  7. )
  8. pause
复制代码
  1. @echo off
  2. REM 待删除的文件夹名
  3. set "folderName=qq"
  4. for /d /r %%i in ("%folderName%?") do (
  5.     if /i "%%~nxi" == "%folderName%" (
  6.         move "%%i\*" "%%i\..\"
  7.         rd "%%i"
  8.     )
  9. )
  10. pause
复制代码

作者: qixiaobin0715    时间: 2020-8-20 21:30

回复 8# WHY
请教两个问题:
1.第二个代码第5行具体判断什么
2.如果指定文件夹有两个以上文件,是否会出现移动一个文件,就将文件夹删除的情况
作者: qixiaobin0715    时间: 2020-8-20 22:25

本帖最后由 qixiaobin0715 于 2020-8-20 22:28 编辑

第2个问题已了解
文件夹不为空,有删除确认对话
用两个for循环,rd放在文件夹循环内,文件循环外,是不是更合理一些
作者: WHY    时间: 2020-8-20 22:45

回复 9# qixiaobin0715


    第 4 行加了通配符 “?”,可以匹配 qq、qq1、qq2等等,所以要用 if 判断一下。
如果不加通配符,相当于 for /d /r %%i in (*) do ... 的结果再叠加上qq
严格来说,第一个脚本最好也加上通配符。之所以没加,是假设 qq 文件夹不在当前目录下。
作者: qixiaobin0715    时间: 2020-8-21 10:07

回复 11# WHY
谢谢解答!!!忘记/r的特性了。这样应当也可以:
  1. @echo off
  2. for /d /r %%i in (dd) do (
  3.   if exist %%i (
  4.     move "%%i\*.*" "%%i\..\"
  5.     rd "%%i"
  6.   )
  7. )
  8. pause
复制代码

作者: lw121    时间: 2020-8-21 22:51

回复 8# WHY


    谢谢
作者: WHY    时间: 2020-8-24 16:20

本帖最后由 WHY 于 2020-8-24 16:23 编辑

回复 12# qixiaobin0715


    这样是可以的。
假设有 100 个文件夹,其中有 2 个文件夹名称分别为 dd、dd1,for 遍历 100 次所花的时间一定比 2 次的时间长,其效率一定比经过筛选后(2个文件)低。
作者: qixiaobin0715    时间: 2020-8-24 16:48

好像是这样的。如上所说,遍历100次都要进行,我的代码每次循环都要判断一次,效率是要低些。




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