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


   大佬,我在测试效率的时候发现,遇到文件夹名称,如 新建文件夹 (2),则会出错
  1. @echo off
  2. call :listdir "%cd%"
  3. pause
  4. exit
  5. :listdir
  6. for /d %%d in ("%~1\*") do set "d=%%d"&call :listdir "%%d"
  7. if defined d (
  8. echo %d%
  9. )
  10. set "d="
复制代码



echo %d%结果,右括号消失了
  1. D:\\1\新建文件夹 (2
复制代码
bat小白,请多指教!谢谢!

TOP

我测试了一下,只判断、打印、计数末级目录,以我的c盘实际情况为例,共有末级目录2200个
  1. 17楼方法一
  2. 11:05:21.13
  3. 11:05:54.99
  4. 耗时 33s
  5. 17楼方法二
  6. 10:56:52.10
  7. 10:57:31.35
  8. 耗时 39s
  9. 17楼方法三
  10. 10:55:53.43
  11. 10:56:24.59
  12. 耗时 31s
  13. 18楼方法
  14. 10:59:32.28
  15. 10:59:45.13
  16. 耗时 13s
复制代码
bat小白,请多指教!谢谢!

TOP

这里可以call一下 ,虽说不太喜欢用
  1. @echo off
  2. set exr="symlink" "txt" "jpg" "doc"
  3. call :listdir "%cd%"
  4. pause
  5. exit
  6. :listdir
  7. for /d %%d in ("%~1\*") do set "d=%%d"&call :listdir "%%d"
  8. if defined d (
  9.         set "n="
  10.         for %%i in ( %exr%) do if exist "%d%\*.%%i" set n=1&move /y "%d%\*.%%i" "%d%\.." >nul 2>nul
  11.         if defined n rd /s /q "%d%"
  12. )
  13. set "d="
复制代码
1

评分人数

    • 77七: 感谢分享技术 + 1

TOP

回复 16# 77七
1.dir是内部命令,运行速度比我们想象的要快得多,定位到C:\,试了一下,25万多个文件夹也就是5分钟之内就解决问题。不知使用for /f+dir会如何;
2.文件夹超多的情况下,如果批处理使用6楼的思路,自定义变量设置数量可能会很多,甚至超限,效率可能更容易受到影响。记得win7系统变量设置最多可能8千多个,win10,win11不知是否放宽了限制。

TOP

回复 18# 77七

老帖中对call的用法议论多多,其中还有慎用甚至不用的说法... 也难为了call先生,要对调用关键词在 "行首标签/内部命令/系统命令/外部(第三方)可执行脚本和程序文件/..." 中逐一匹配择取,也不知其匹配优先权如何,反正够累的

TOP

本帖最后由 aloha20200628 于 2024-4-11 22:14 编辑

回复 12# mmm8422616

以下代码会处理当前目录下所有末级目录,但假设 “仅当末级目录中确实有文件被移动后” 才删除该末级目录...
代码中第3行可增减多个被空格分隔的用双引号包裹的文件扩展名字段
  1. @echo off &setlocal
  2. (for /d /r %%d in (*) do dir /b/ad "%%~d\*" |find /v "">nul || (
  3. for %%F in ( "symlink" "jpg" "nfo" "mkv" "mp4") do if exist "%%d\*.%%F" (set/a "n=1"&move /y "%%d\*.%%F" "%%d\..")
  4. if defined n (set "n="&rd /s/q "%%d")
  5. )) 2>nul
  6. pause &exit/b
复制代码

TOP

回复 17# aloha20200628


    谢谢大佬指点!
如果某目录下子目录众多,使用call + for /d 及时退出遍历应该也行,不过没有dir 灵活,不能识别隐藏目录

  1. @echo off
  2. call :1 "C:\0\1\2\3"
  3. if %errorlevel% equ 2 (
  4. echo "C:\0\1\2\3" 是末级目录
  5. )
  6. pause & exit
  7. :1
  8. for /r "%~1" /d %%e in (*) do (
  9. exit /b 1
  10. )
  11. exit /b 2
复制代码
bat小白,请多指教!谢谢!

TOP

回复 16# 77七

单论判断一个指定目录(例如 C:\0\1\2\3)是否包含子目录,至少有三个方法如下
如果指定目录中确实没有子目录,各方法耗时差别几乎无感,但若真有好多多子目录,那差别就不一般了,方法三可是要用纯P去逐个遍历啊 所以中外老帖中还是用方法一或方法二为多。
  1. ::方法一
  2. dir /b/ad "C:\0\1\2\3" | find /v "">nul || echo,是末级目录
  3. ::方法二
  4. dir /b/ad "C:\0\1\2\3" | findstr ".">nul || echo,是末级目录
  5. ::方法三
  6. set "n=" &for /f "delims=" %%j in ('dir /b/ad ""C:\0\1\2\3"') do set "n=1"
  7. if not defined n echo,是末级目录
复制代码
1

评分人数

    • 77七: 感谢分享技术 + 1

TOP

回复 8# qixiaobin0715


   谢谢大佬指点!没考虑文件夹过多情况,如果文件夹数量成百上千、甚至过万,可能使用dir 都会影响效率;如果文件夹过多,目标文件且多存在于末级文件夹,使用dir /a-d 初步筛选可能符合条件的文件夹,可能更快点,具体看楼主实际情况吧:lol
bat小白,请多指教!谢谢!

TOP

本帖最后由 aloha20200628 于 2024-4-11 18:37 编辑

回复 12# mmm8422616
处理(删除)“多个” 末级目录和处理(删除)“每个” 末级目录可不是一回事

TOP

本帖最后由 qixiaobin0715 于 2024-4-11 16:58 编辑
  1. @echo off
  2. for /f "delims=" %%i in ('dir /s /b /ad') do (
  3.     set n=
  4.     for /f "delims=" %%j in ('dir /b /ad "%%i"') do set n=true
  5.     if not defined n (
  6.         set m=
  7.         for /f "delims=" %%k in ('dir /b /a-d *.symlink *.mp4 *.mkv') do (
  8.             set m=true
  9.             move "%%i\%%k" "%%i\.."
  10.         )
  11.         if defined m rd /s /q "%%i"
  12.     )
  13. )
  14. pause
复制代码

TOP

回复 11# mmm8422616


  1. @echo off
  2. cd /d "%~dp0"
  3. set str=symlink mp4 mkv
  4. for /f "delims=" %%d in ('dir /b /s /ad') do (
  5. dir /b /ad "%%d" |findstr . 1>nul || set _"%%d"=1
  6. )
  7. for /f "delims=" %%d in ('dir /b /s /ad') do (
  8. if defined _"%%d" (
  9. for %%x in (%str%) do (
  10. if exist "%%d\*.%%x" (
  11. move "%%d\*.%%x" "%%d\.."
  12. set _"%%d"=
  13. )
  14. )
  15. if not defined _"%%d" (
  16. del /q "%%d\*"
  17. rd "%%d"
  18. )
  19. )
  20. )
  21. pause
复制代码
bat小白,请多指教!谢谢!

TOP

回复 10# aloha20200628


    这个好像不符合我的要求 你直接定义到了一个目录下了 实际上有很多大量这样类似的目录结构 需要批量进行

TOP

回复  mmm8422616
77七 发表于 2024-4-10 16:32



    实际使用过程中发现了点小问题,麻烦大大给修改一下,比如目录下面有这几种类型的文件 .symlink .mp4 .mkv .nfo .jpg 等等的,我需要把.symlink .mp4 .mkv这几种类型的文件进行移动,然后再删除目录下的其他文件、再删除此文件夹。

现在的情况是,我移动了symlink类型的文件后,也删除了我想移动的mp4 mkv类型的文件了 当时没有考虑文件夹下有不同的影视文件类型。

麻烦大大给修改一下啊!

TOP

回复 1# mmm8422616

一楼题意是指“最后一级目录(不再含子目录)”,如是则代码也许可进一步简化...
以下代码假设最后一级目录为 d:\a\aa\aaa
  1. @echo off &set "_cd=d:\a\aa\aaa"
  2. cd /d "%_cd%" &(for %%F in ( "symlink" "jpg" "nfo" ) do move /y "*.%%~F" "..") 2>nul
  3. cd ".." & rd /s/q "%_cd%" &pause &exit/b
复制代码

TOP

返回列表