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

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

本帖最后由 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*.*

本帖最后由 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*.*
复制代码

TOP

  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. )
复制代码

TOP

本帖最后由 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
复制代码

TOP

本帖最后由 ygqiang 于 2025-4-3 14:59 编辑

回复 4# aloha20200628


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

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

rd和del可以放在一起操作文件名和文件吧?
rd 文件名称,del 文件名。
这2种情况,如果遇到了,实际也不会有什么副作用?

TOP

本帖最后由 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*.*
复制代码

TOP

回复 6# aloha20200628


    谢谢,可用

TOP

  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
复制代码
bat小白,请多指教!谢谢!

TOP

本帖最后由 ygqiang 于 2025-4-3 16:56 编辑

回复 8# 77七


    谢谢。需要排除的一级子目录和一级子文件,列出来。
感觉可读性不如楼上的代码

TOP

本帖最后由 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
复制代码
bat小白,请多指教!谢谢!

TOP

回复 10# 77七


      谢谢。这个代码,哪些特殊情况下会遇到问题呢?

TOP

回复 11# ygqiang


   文件夹和文件横着写成了两行,竖着却只有一列,已经埋下了“祸根”,无法区分文件、文件夹,只有区分它们之后才可进行文件夹的完全匹配、文件的开头匹配,假如匹配末尾(保留*.txt,很常见),代码则完全不适用。
假如仍要写成竖列,比如写两列,以列区分 或者以行区分 或者添加辅助字符去区分,代码进一步复杂,属于多此一举,且真正降低了代码的可读性、可维护性。
bat小白,请多指教!谢谢!

TOP

回复 10# 77七


    这代码测试了,不好用

TOP

最终代码,测试通过。
  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*.*
复制代码

TOP

回复 14# ygqiang


  ”pagefile.sys“ 这个子文件包括在文件夹的排除列表中了,即变量 !d!,会导致误删,还需要更可靠的方法分辨文件夹和文件。
bat小白,请多指教!谢谢!

TOP

返回列表