[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

一个文件夹下有N级文件夹,需要把最末级的文件夹复制到它的父文件夹
下图是比较规律的文件夹结构
实操时文件夹结构比较复杂  需要首先判断末级文件夹
非常好的论坛

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

评分人数

TOP

回复 1# 001011


    遇到同名文件夹的冲突问题需要如何处理呢?
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

本帖最后由 001011 于 2020-10-4 23:51 编辑

非常感谢
就是有个问题  比如说A--1--1这样的文件夹结构
由于子文件夹名和父文件夹名相同  造成无法移动
有办法解决吗
非常好的论坛

TOP

回复 3# Batcher

是啊  我也在纠结这个问题
非常好的论坛

TOP

回复 5# 001011


这个不是代码需要解决的问题,而是需要问你自己想现实什么功能。
以你顶楼的截图为例:
A\1\1 不止跟 A\1 冲突,还会跟 A\2\1 冲突。
要么合并、要么覆盖、要么重命名,你得先想清楚需求,然后再讨论代码如何实现。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 6# Batcher
谢谢回复
确实是我考虑不周
实际操作中 只会有这种情况:A\1\1  没有A\2\1的情况
最终A\1中是1会删除掉的(A\1\1中是末级文件夹1已经移动到A下面了,所以父文件夹的1就是个空文件夹,当然也可以在程序运行的时候删掉更好)  所以可以考虑把A\1中的1改名后  再移动文件
非常好的论坛

TOP

本帖最后由 newswan 于 2020-10-5 16:43 编辑

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

A
A\1
A\1\1
A\1\2

TOP

根据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

评分人数

    • 001011: 感谢 辛苦了技术 + 1

TOP

本帖最后由 001011 于 2020-10-5 18:16 编辑

回复 9# qixiaobin0715


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

还有一个简单办法 不用重命名  只需要
出一个文档  告诉一下那个文件夹下的那个文件夹和那个文件夹名字重复  也可以
非常好的论坛

TOP

回复 8# newswan


    能否把代码发出来看下你是如何解决文件夹同名问题的?
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

本帖最后由 newswan 于 2020-10-7 12:53 编辑

回复 11# Batcher


我的意思是,先导出目录列表,检查重名
另外,我还有一个问题,移动目录的规则,不能是把最低一级的目录向上移动一次,而应该是某目录之下,某一级子目录的子目录向上一级。
这样可能更可靠一些,比如,处理过程中出错,一部分经过处理,一部分没有。

TOP

本帖最后由 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. )
复制代码
或者用占位文件模拟一次

TOP

本帖最后由 qixiaobin0715 于 2020-10-6 09:07 编辑

回复 10# 001011

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

如果像你在一楼所列移动文件夹,A\1和A\2,B\1和B\2不但存在上下级重名,还存在同级重名的话,就必须更改需移动的文件夹名了。

TOP

抱歉,楼上帖子中有点想当然。实测循环过程中更改中间级文件夹的名称不可行(for循环开始时已将所有路径规划好),改名后路径变化,会出现提示“系统找不到指定的文件”。还是分步处理的好。

TOP

返回列表