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

[文件操作] [已解决]批处理移动一级子目录下且仅有一个文件的将这一个文件移动到当前目录的逻辑

本帖最后由 thp2008 于 2023-12-1 14:05 编辑

我想批量将当前目录下,比如有500个子目录,但是其中可能有300个子目录,下面只有一个文件,而且这300子目录下面,没有其它的子目录了,剩下的子目录下可能有多级子目录,或者多于1个文件,
我的要求是:只检查当前目录下的,一级子目录。就是当前目录的一级子目录,如果这个一级子目录没有其它子目录了,文件数量又只有一个的情况,将这符合要求的300个子目录的文件,移动到当前目录,遇到重名的,自动在文件后面加序号,移动完成后,将这些空目录删除。
这个逻辑AI始终搞不定,只能来求助大神了。
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

保存为ansi编码的bat,放到当前目录下运行
使用前先测试,测试前先备份
  1. @echo off
  2. for /d %%a in (*) do (
  3. setlocal
  4. for /d %%b in ("%%a\*") do set hasfolder=1
  5. if not defined hasfolder (
  6. for %%c in ("%%a\*") do (
  7. set file=%%~fc
  8. set /a n+=1
  9. )
  10. setlocal enabledelayedexpansion
  11. if !n! == 1 (endlocal&call :aaa) else endlocal
  12. )
  13. endlocal
  14. )
  15. echo,&pause&exit/b
  16. :aaa
  17. if defined m set "p=(%m%)"
  18. for %%z in ("%file%") do (
  19. if not exist "%%~nz%p%%%~xz" (
  20. move "%%~z" ".\%%~nz%p%%%~xz" && rmdir "%%~dpz") else (
  21. set /a m+=1&goto :aaa
  22. )
  23. )
  24. goto :eof
复制代码
1

评分人数

TOP

本帖最后由 thp2008 于 2023-12-1 14:04 编辑

帮谢您的帮助,可以移动成功,只是移动完成后,删除文件夹,需要做一下,延时处理,否则删除不了,提示:目录不是空的。

如果延时不好处理,或者可以改变一下思路,首先只将符合要求的文件,移动到当前目录,全部移动完成后,单独用一段代码,删除当前目录下的,所有空目录。

我仔细研究了一下,是所有这些目录下,都有一个隐藏属性的种子文件,所以删除不了。

我修改了一下,搞定了,感谢!
  1. @echo off
  2. echo 移动当
  3. for /d %%a in (*) do (
  4. setlocal
  5. for /d %%b in ("%%a\*") do set hasfolder=1
  6. if not defined hasfolder (
  7. for %%c in ("%%a\*") do (
  8. set file=%%~fc
  9. set /a n+=1
  10. )
  11. setlocal enabledelayedexpansion
  12. if !n! == 1 (endlocal&call :aaa) else endlocal
  13. )
  14. endlocal
  15. )
  16. del *.torrent /s/a
  17. for /f "tokens=*" %%a in ('dir /b /ad /s^|sort /r') do rd "%%a" >nul
  18. echo 空目录删除完成。
  19. echo,&pause&exit/b
  20. :aaa
  21. if defined m set "p=(%m%)"
  22. for %%z in ("%file%") do (
  23. if not exist "%%~nz%p%%%~xz" (
  24. move "%%~z" ".\%%~nz%p%%%~xz") else (
  25. set /a m+=1&goto :aaa
  26. )
  27. )
  28. goto :eof
复制代码

TOP

本帖最后由 qixiaobin0715 于 2023-12-3 10:26 编辑

真心不习惯用goto和call语句,这样不知可否,未测试:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. del /s /a /f *.torrent
  4. for /f "delims=" %%i in ('dir /b /ad') do (
  5.     set n=0
  6.     pushd "%%i"
  7.     for /f "delims=" %%j in ('dir /b') do set /a n+=1
  8.     if !n! equ 1 (
  9.         for /f "delims=" %%k in ('dir /b /a-d 2^>nul') do (
  10.             set /a "_%%k+=1"
  11.             if "!_%%k!"=="1" (
  12.                 move "%%k" "%~dp0"
  13.             ) else (
  14.                 move "%%k" "%~dp0\%%~nk!_%%k!%%~xk"
  15.             )
  16.         )
  17.     )
  18.     popd
  19.     rd "%%i" 2>nul
  20. )
  21. pause
复制代码
善意提醒:自己根据情况看看第3行del命令放在何处符合要求。上面会删除当前目录下的所有有关文件,包括子目录。
1

评分人数

TOP

真心不习惯用goto和call语句,这样不知可否,未测试:善意提醒:自己根据情况看看第3行del命令放在何处符合 ...
qixiaobin0715 发表于 2023-12-1 16:29


可以,感谢帮助,就是有一点,如果遇到有同名文件,你这个会加序号,但是把扩展名弄没了,其它没问题。

TOP

回复 5# thp2008
代码第14行把扩展名加上就行啊,还是要懂一点批处理基础知识的。

TOP

本帖最后由 qixiaobin0715 于 2023-12-4 15:15 编辑

回复 4# qixiaobin0715
需要提醒的一点是使用此代码时,文件名中不能含有“+-...”等运算符,这些符号在第10行代码中为非法变量名。

TOP

好的,明白了,感谢提醒。

TOP

返回列表