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

[文件操作] [已解决]批处理将子目录里的文件夹移动到父目录中去

[复制链接]
发表于 2020-10-4 20:47:47 | 显示全部楼层 |阅读模式
一个文件夹下有N级文件夹,需要把最末级的文件夹复制到它的父文件夹
下图是比较规律的文件夹结构
实操时文件夹结构比较复杂  需要首先判断末级文件夹
发表于 2020-10-4 21:53:58 | 显示全部楼层
folder是主文件夹,如果主文件夹含中文,代码保存为asni编码,注意备份
  1. @echo off
  2. set "folder=G:\Desktop\test"
  3. for /r "%folder%" /d %%i in (*) do (
  4.         dir /b /ad "%%i" | findstr . >nul || (
  5.                 echo %%i
  6.                 move "%%i" "%%~dpi\.."
  7.                 echo -----------------------
  8.         )
  9. )
  10. pause&exit
复制代码

评分

参与人数 1技术 +1 收起 理由
001011 + 1 感谢 感谢

查看全部评分

发表于 2020-10-4 22:00:33 | 显示全部楼层
回复 1# 001011


    遇到同名文件夹的冲突问题需要如何处理呢?
 楼主| 发表于 2020-10-4 22:05:02 | 显示全部楼层
本帖最后由 001011 于 2020-10-4 23:51 编辑

非常感谢
就是有个问题  比如说A--1--1这样的文件夹结构
由于子文件夹名和父文件夹名相同  造成无法移动
有办法解决吗
 楼主| 发表于 2020-10-4 22:05:54 | 显示全部楼层
回复 3# Batcher

是啊  我也在纠结这个问题
发表于 2020-10-4 22:49:39 | 显示全部楼层
回复 5# 001011


这个不是代码需要解决的问题,而是需要问你自己想现实什么功能。
以你顶楼的截图为例:
A\1\1 不止跟 A\1 冲突,还会跟 A\2\1 冲突。
要么合并、要么覆盖、要么重命名,你得先想清楚需求,然后再讨论代码如何实现。
 楼主| 发表于 2020-10-4 23:15:46 | 显示全部楼层
回复 6# Batcher
谢谢回复
确实是我考虑不周
实际操作中 只会有这种情况:A\1\1  没有A\2\1的情况
最终A\1中是1会删除掉的(A\1\1中是末级文件夹1已经移动到A下面了,所以父文件夹的1就是个空文件夹,当然也可以在程序运行的时候删掉更好)  所以可以考虑把A\1中的1改名后  再移动文件
发表于 2020-10-5 16:31:44 | 显示全部楼层
本帖最后由 newswan 于 2020-10-5 16:43 编辑

思路:
1  dir /s /ad 列出所有目录
2  根据目录列表,重命名文件夹

A
A\1
A\1\1
A\1\2
发表于 2020-10-5 16:52:33 | 显示全部楼层
根据2楼代码修改,需移动的文件夹重命名为“上一级文件夹名-移动前文件夹名”
  1. @echo off
  2. for /r /d %%a in (*) do (
  3.     dir /b /ad "%%a" | findstr . >nul || (
  4.         for %%i in ("%%a\..") do move "%%a" "%%~dpa\..\%%~nxi-%%~na"
  5.     )
  6. )
  7. pause&exit
复制代码

评分

参与人数 1技术 +1 收起 理由
001011 + 1 感谢 辛苦了

查看全部评分

 楼主| 发表于 2020-10-5 18:12:17 | 显示全部楼层
本帖最后由 001011 于 2020-10-5 18:16 编辑

回复 9# qixiaobin0715


    感谢回复
但是把需要移动的文件夹加前缀好麻烦  还得把前缀去掉
可以命名父文件夹吗  因为移动后父文件夹就没有用了

还有一个简单办法 不用重命名  只需要
出一个文档  告诉一下那个文件夹下的那个文件夹和那个文件夹名字重复  也可以
发表于 2020-10-5 23:05:13 | 显示全部楼层
回复 8# newswan


    能否把代码发出来看下你是如何解决文件夹同名问题的?
发表于 2020-10-5 23:55:09 | 显示全部楼层
本帖最后由 newswan 于 2020-10-7 12:53 编辑

回复 11# Batcher


我的意思是,先导出目录列表,检查重名
另外,我还有一个问题,移动目录的规则,不能是把最低一级的目录向上移动一次,而应该是某目录之下,某一级子目录的子目录向上一级。
这样可能更可靠一些,比如,处理过程中出错,一部分经过处理,一部分没有。
发表于 2020-10-6 01:23:34 | 显示全部楼层
本帖最后由 newswan 于 2020-10-6 01:34 编辑

列出目录,
第一列是移动后的路径,第二列是移动前的路径
  1. set _fld_=test
  2. for /f %%a in ('dir /b /ad %_fld_%') do (
  3.         >>list.txt echo %%a
  4.         for /f %%b in ('dir /b /ad %_fld_%\%%a') do (
  5.                 >>list.txt echo %%b \%%a\%%b
  6.                 if not exist %_fld_%\%%b (
  7.                         copy nul %_fld_%\%%b
  8.                 ) else (
  9.                         copy nul %_fld_%\%%a-%%b
  10.                 )
  11.         )
  12.         rmdir %%a
  13. )
复制代码
或者用占位文件模拟一次
发表于 2020-10-6 08:07:16 | 显示全部楼层
本帖最后由 qixiaobin0715 于 2020-10-6 09:07 编辑

回复 10# 001011

如果只是最后一级文件夹及上一级文件夹重名的话,代码已获得最后一级文件夹及上一级文件夹,还不是想移就移,想改就改,想删就删,只是不知你具体的文件结构。最后一级文件夹及上一级文件夹重名可用if判断一下,根据你自己的实际需求修改代码。
还有一个办法就是分步走:
1.运行上面代码移动文件夹
2.删除空文件夹,论坛里有的
3.还原改名的文件夹,用类似str=!str:*-=!的结构
不就是运行三个批处理吗,也不是太麻烦。这样还不容易出错。

如果像你在一楼所列移动文件夹,A\1和A\2,B\1和B\2不但存在上下级重名,还存在同级重名的话,就必须更改需移动的文件夹名了。
发表于 2020-10-9 14:28:18 | 显示全部楼层
抱歉,楼上帖子中有点想当然。实测循环过程中更改中间级文件夹的名称不可行(for循环开始时已将所有路径规划好),改名后路径变化,会出现提示“系统找不到指定的文件”。还是分步处理的好。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-20 11:19 , Processed in 0.023009 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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