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

[文件操作] (已解决)检索某个根目录下的一级子目录和一级子文件,保留或删除。bat代码?

[复制链接]
发表于 2025-4-2 22:14:32 | 显示全部楼层 |阅读模式
本帖最后由 ygqiang 于 2025-4-3 16:13 编辑

检索某个根目录下的一级子目录和一级子文件,符合要求就保留,否则就删除。bat代码?
只针对根目录下的一级子目录和一级子文件,检索、判断、操作(保留或删除)。


c盘根目录下,需要保留的一级子目录和一级子文件,名称如下:
---------------------------------------
一级子目录名称是
Intel
PerfLogs
Program Files
Program Files (x86)
Windows
Users
(下面是隐藏的子目录)
8888
Boot
Config.Msi
Documents and Settings
MSOCache
ProgramData
---------------------------------------


---------------------------------------
一级子文件名称是
kernel*.*
sealdr*.*
(下面是隐藏的文件)
ABSPE*.*
bootmgr*.*
BOOTSECT*.*
 楼主| 发表于 2025-4-2 22:44:40 | 显示全部楼层
本帖最后由 ygqiang 于 2025-4-3 14:32 编辑
  1. @echo off
  2. setlocal enabledelayedexpansion

  3. for /f "delims=:" %%i in ('findstr /n "^:del-dir$" "%~f0"') do (
  4.     more +%%i "%~f0" > 保留子目录和子文件.txt
  5. )


  6. echo 循环读取txt文件的每一行,赋值给变量

  7. set targe=''

  8. for /f "delims=" %%i in (保留子目录和子文件.txt) do (
  9. set target=%%i
  10. echo !target!
  11. pause >nul 2>nul
  12. cls >nul 2>nul


  13. )


  14. pause >nul 2>nul
  15. cls

  16. exit




  17. ———————————————————————
  18. :del-dir
  19. Intel
  20. PerfLogs
  21. Program Files
  22. Program Files (x86)
  23. Windows
  24. Users
  25. 8888
  26. Boot
  27. Config.Msi
  28. Documents and Settings
  29. MSOCache
  30. ProgramData
  31. kernel*.*
  32. sealdr*.*
  33. ABSPE*.*
  34. bootmgr*.*
  35. BOOTSECT*.*
复制代码
 楼主| 发表于 2025-4-3 10:17:09 | 显示全部楼层
  1. REM 遍历所有一级文件和目录
  2. for /f "delims=" %%d in ('dir /b /ad "%root_dir%"') do (
  3.     echo Checking directory: %%d
  4.     if not "%%d"=="!target!" (
  5.         echo directory: %%d
  6. cls
  7.         echo rmdir /s /q "%root_dir%\%%d"
  8. pause
  9.     )
  10. )

  11. for /f "delims=" %%f in ('dir /b /a-d "%root_dir%"') do (
  12.     echo Checking file: %%f
  13.     if not "%%f"=="!target!" (
  14.         echo file: %%f
  15. cls
  16.         echo del /q "%root_dir%\%%f"
  17. pause
  18.     )
  19. )
复制代码
发表于 2025-4-3 13:28:31 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-4-3 14:25 编辑

回复 1# ygqiang

本帖主要解决字符串中筛选指定关键词的问题...
以下是预览版,确认无误后可删除代码倒数第二行和第三行中的 echo, 变成实用版

  1. @echo off &setlocal enabledelayedexpansion &cd /d "c:"
  2. for %%d in (
  3.         "Intel"
  4.         "PerfLogs"
  5.         "Program Files"
  6.         "Program Files (x86)"
  7.         "Windows"
  8.         "Users"
  9.         "8888"
  10.         "Boot"
  11.         "Config.Msi"
  12.         "Documents and Settings"
  13.         "MSOCache"
  14.         "ProgramData"
  15. ) do set d=!d! /c:"%%~d!"
  16. for /f "delims=" %%d in ('dir/b/ad^|findstr /irv !d!') do echo,rd /q/s "%%d"
  17. for /f "delims=" %%F in ('dir/b/a-d^|findstr /irv /c:"kernel.*" /c:"sealdr.*" /c:"ABSPE.*" /c:"bootmgr.*" /c:"BOOTSECT.*" ') do echo,del /q "%%F"
  18. pause&exit/b
复制代码
 楼主| 发表于 2025-4-3 14:30:53 | 显示全部楼层
本帖最后由 ygqiang 于 2025-4-3 14:59 编辑

回复 4# aloha20200628


    谢谢,能否按照2楼代码,需要排除的
所有的一级子目录和一级子文件,
都存放在一个txt文件里?

然后判断,操作,都根据这个txt文件进行

rd和del可以放在一起操作文件名和文件吧?
rd 文件名称,del 文件名。
这2种情况,如果遇到了,实际也不会有什么副作用?
发表于 2025-4-3 15:36:51 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-4-3 16:45 编辑

回复 5# ygqiang

采用一楼用*通配符区分目录与文件的判据
以下代码是预览版,确认无误后可删除代码第4行和第5行中的 echo, 变成实用版

  1. @echo off &setlocal enabledelayedexpansion &cd /d "c:"
  2. for /f "delims=:" %%n in ('findstr /bln ":::" "%~f0" ') do set "n=%%n"
  3. for /f "usebackq skip=%n% tokens=1* delims=*" %%a in ("%~f0") do if "%%b"== "" (set d=!d! /c:"%%~a!") else (set F=!F! /c:"%%~a!")
  4. for /f "delims=" %%d in ('dir/b/ad^|findstr /irv !d!') do echo,rd /q/s "%%d"
  5. for /f "delims=" %%F in ('dir/b/a-d^|findstr /irv !F!') do echo,del /q "%%F"
  6. pause&exit/b
  7. :::
  8. Intel
  9. PerfLogs
  10. Program Files
  11. Program Files (x86)
  12. Windows
  13. Users
  14. 8888
  15. Boot
  16. Config.Msi
  17. Documents and Settings
  18. MSOCache
  19. ProgramData
  20. kernel*.*
  21. sealdr*.*
  22. ABSPE*.*
  23. bootmgr*.*
  24. BOOTSECT*.*
复制代码
 楼主| 发表于 2025-4-3 16:11:45 | 显示全部楼层
回复 6# aloha20200628


    谢谢,可用
发表于 2025-4-3 16:25:05 | 显示全部楼层
  1. @echo off
  2. set root_dir=c:\

  3. set folderlist="Intel" "PerfLogs" "Program Files" "Program Files (x86)" "Windows" "Users" "8888" "Boot" "Config.Msi" "Documents and Settings" "MSOCache" "ProgramData"
  4. set filelist="kernel*.*" "sealdr*.*" "ABSPE*.*" "bootmgr*.*" "BOOTSECT*.*"
  5. for %%a in (%folderlist%) do (
  6.         set d"%%~a"=1
  7. )

  8. setlocal
  9. pushd "%root_dir%"
  10. for /f "delims=" %%i in ('2^>nul dir /b /a-d %filelist%') do (
  11.         set f"%%i"=1
  12. )
  13. for /f "delims=" %%d in ('dir /b /a') do (
  14.         if exist "%%d" (
  15.                 if not defined d"%%d" (
  16.                         echo rd /s /q "%%d"
  17.                 )
  18.         ) else if not defined f"%%d" (
  19.                 echo del /a /f "%%d"
  20.         )
  21. )
  22. popd
  23. endlocal

  24. pause
复制代码
 楼主| 发表于 2025-4-3 16:53:00 | 显示全部楼层
本帖最后由 ygqiang 于 2025-4-3 16:56 编辑

回复 8# 77七


    谢谢。需要排除的一级子目录和一级子文件,列出来。
感觉可读性不如楼上的代码
发表于 2025-4-3 19:26:09 | 显示全部楼层
本帖最后由 77七 于 2025-4-3 19:29 编辑

回复 9# ygqiang



如果要求不严谨,突出一个“能用就行“,楼主可试试以下代码 (删除操作需删除echo 及转义符^再执行)。
  1. @echo off
  2. set root_dir=c:
  3. (for /f "delims=" %%a in ('dir /b /a "%root_dir%" ^| findstr /livbg:"%~f0"') do (
  4.         echo rd /s /q "%root_dir%\%%a" ^|^| del /a /f "%root_dir%\%%a"
  5. )) 2>nul
  6. pause
  7. exit
  8. Intel
  9. PerfLogs
  10. Program Files
  11. Program Files (x86)
  12. Windows
  13. Users
  14. 8888
  15. Boot
  16. Config.Msi
  17. Documents and Settings
  18. MSOCache
  19. ProgramData
  20. kernel
  21. sealdr
  22. ABSPE
  23. bootmgr
  24. BOOTSECT
复制代码
 楼主| 发表于 2025-4-4 07:48:06 | 显示全部楼层
回复 10# 77七


      谢谢。这个代码,哪些特殊情况下会遇到问题呢?
发表于 2025-4-4 10:32:37 | 显示全部楼层
回复 11# ygqiang


   文件夹和文件横着写成了两行,竖着却只有一列,已经埋下了“祸根”,无法区分文件、文件夹,只有区分它们之后才可进行文件夹的完全匹配、文件的开头匹配,假如匹配末尾(保留*.txt,很常见),代码则完全不适用。
假如仍要写成竖列,比如写两列,以列区分 或者以行区分 或者添加辅助字符去区分,代码进一步复杂,属于多此一举,且真正降低了代码的可读性、可维护性。
 楼主| 发表于 2025-4-7 14:57:16 | 显示全部楼层
回复 10# 77七


    这代码测试了,不好用
 楼主| 发表于 2025-4-7 15:47:24 | 显示全部楼层
最终代码,测试通过。
  1. @echo off & setlocal enabledelayedexpansion
  2. echo 代码开始

  3. echo 删除c盘根目录下的一级子目录和一级子文件
  4. cd /d "c:"

  5. for /f "delims=:" %%n in ('findstr /bln ":::::::::::::::::::::::::::::::::" "%~f0" ') do set "n=%%n"
  6. for /f "usebackq skip=%n% tokens=1* delims=*" %%a in ("%~f0") do if "%%b"== "" (set d=!d! /c:"%%~a!") else (set F=!F! /c:"%%~a!")
  7. for /f "delims=" %%d in ('dir/b/ad^|findstr /irv !d!') do echo,rd /q/s "%%d"
  8. for /f "delims=" %%F in ('dir/b/a-d^|findstr /irv !F!') do echo,del /q "%%F"
  9. pause

  10. for /f "delims=" %%d in ('dir/b/ad^|findstr /irv !d!') do rd /q/s "%%d"
  11. for /f "delims=" %%F in ('dir/b/a-d^|findstr /irv !F!') do del /q "%%F"

  12. pause&exit/b




  13. :::::::::::::::::::::::::::::::::
  14. echo,一级子目录
  15. Intel
  16. PerfLogs
  17. Program Files
  18. Program Files (x86)
  19. Windows
  20. Users
  21. $RECYCLE.BIN
  22. 8888
  23. Boot
  24. Config.Msi
  25. Documents and Settings
  26. MSOCache
  27. ProgramData
  28. Recovery
  29. System Volume Information
  30. echo,一级子文件
  31. kernel*.*
  32. pagefile.sys
  33. sealdr*.*
  34. ABSPE*.*
  35. bootmgr*.*
  36. BOOTSECT*.*
复制代码
发表于 2025-4-7 17:41:43 | 显示全部楼层
回复 14# ygqiang


  ”pagefile.sys“ 这个子文件包括在文件夹的排除列表中了,即变量 !d!,会导致误删,还需要更可靠的方法分辨文件夹和文件。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-17 07:20 , Processed in 0.020639 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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