找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 30143|回复: 14

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

[复制链接]
发表于 2020-8-19 19:02:14 | 显示全部楼层 |阅读模式
本帖最后由 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
发表于 2020-8-20 08:15:16 | 显示全部楼层
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
 楼主| 发表于 2020-8-20 09:38:02 | 显示全部楼层
回复 2# gzaapy


    很多文件,并不是只有四条......
发表于 2020-8-20 10:50:59 | 显示全部楼层
 楼主| 发表于 2020-8-20 15:23:41 | 显示全部楼层
回复 4# qixiaobin0715


    我只需要移动指定子目录文件,其他同级的不变化
发表于 2020-8-20 15:33:51 | 显示全部楼层
回复 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
复制代码
发表于 2020-8-20 16:47:28 | 显示全部楼层
本帖最后由 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
复制代码
发表于 2020-8-20 19:58:28 | 显示全部楼层
  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
复制代码
发表于 2020-8-20 21:30:28 | 显示全部楼层
回复 8# WHY
请教两个问题:
1.第二个代码第5行具体判断什么
2.如果指定文件夹有两个以上文件,是否会出现移动一个文件,就将文件夹删除的情况
发表于 2020-8-20 22:25:47 | 显示全部楼层
本帖最后由 qixiaobin0715 于 2020-8-20 22:28 编辑

第2个问题已了解
文件夹不为空,有删除确认对话
用两个for循环,rd放在文件夹循环内,文件循环外,是不是更合理一些
发表于 2020-8-20 22:45:28 | 显示全部楼层
回复 9# qixiaobin0715


    第 4 行加了通配符 “?”,可以匹配 qq、qq1、qq2等等,所以要用 if 判断一下。
如果不加通配符,相当于 for /d /r %%i in (*) do ... 的结果再叠加上qq
严格来说,第一个脚本最好也加上通配符。之所以没加,是假设 qq 文件夹不在当前目录下。
发表于 2020-8-21 10:07:48 | 显示全部楼层
回复 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
复制代码
 楼主| 发表于 2020-8-21 22:51:43 | 显示全部楼层
回复 8# WHY


    谢谢
发表于 2020-8-24 16:20:17 | 显示全部楼层
本帖最后由 WHY 于 2020-8-24 16:23 编辑

回复 12# qixiaobin0715


    这样是可以的。
假设有 100 个文件夹,其中有 2 个文件夹名称分别为 dd、dd1,for 遍历 100 次所花的时间一定比 2 次的时间长,其效率一定比经过筛选后(2个文件)低。
发表于 2020-8-24 16:48:47 | 显示全部楼层
好像是这样的。如上所说,遍历100次都要进行,我的代码每次循环都要判断一次,效率是要低些。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-20 04:34 , Processed in 0.021472 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表