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

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

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

回复 18# 唏嘘的南巴仔


参考for命令教程第10页:
http://bbs.bathome.net/thread-31727-1-1.html
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 2# went




for /r "%folder%" /d %%i in (*) do (  

请教一下   
    "%folder%" /d  
    这个/d 有什么作用?可以把这个/d 移动到 /r  后面吗?

TOP

回复 16# 001011
由于批处理运行时是按顺序一行行执行的,上面所说的三步可以写在一个批处理里面。
  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" >nul
  5.     )
  6. )
  7. for /f "delims=" %%m in ('dir /ad /b /s^|sort /r') do rd "%%m" 2>nul
  8. setlocal enabledelayedexpansion
  9. for /r /d %%n in (*) do (
  10.     dir /b /ad "%%n" | findstr . >nul || (
  11.         set var=%%n
  12.         set var=!var:*_=!
  13.         ren "%%n" "!var!"
  14.     )
  15. )
  16. pause&exit
复制代码
1

评分人数

    • 001011: 非常好用 感谢啊技术 + 1

TOP

感谢大家,刚刚上班比较忙没有及时感谢各位老师 抱歉了
关于这个问题的解决办法,线下有个朋友帮忙解决了
方法是:首先剪切出所有文件夹,剪切出来以后把这文件夹加一个统一的后缀,如:1_new,在全部剪切出来后删除空文件夹,这样也就把原先的父文件夹删除掉了  再统一去掉后缀  然后就OK了
请原谅不能把代码贴出来  因为朋友写的是类似exe的程序 我看不到代码
再次感谢
非常好的论坛

TOP

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

TOP

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

回复 10# 001011

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

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

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

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

回复 11# Batcher


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

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

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

回复 9# qixiaobin0715


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

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

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

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

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

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

TOP

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

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

返回列表