Board logo

标题: [文件操作] 【已解决】请教批处理保留匹配的文件夹并删除其他文件夹的问题 [打印本页]

作者: 不知道是谁    时间: 2023-11-21 10:50     标题: 【已解决】请教批处理保留匹配的文件夹并删除其他文件夹的问题

本帖最后由 不知道是谁 于 2023-11-23 12:43 编辑

temp文件夹下有若干文件夹,只保留txt文件夹
txt文件夹下有若干文件夹,只保留下一层目录内有以bak结尾的文件夹
比如路径是 d:\test\temp\txt\1\bat-bak 则保留
路径是 d:\test\temp\txt\2\bat-tmp 则删除

这两条命令能合并成一条吗?或者有没有其他更好的方法,仅限批处理
  1. @echo off
  2. set path1=d:\test\temp
  3. set path2=d:\test\temp\txt
  4. for /f "delims=" %%i in ('dir /ad /b "%path1%"') do (
  5.     if not "%%i"=="txt" rd /s /q "%path1%\%%i"
  6. )
  7. for /f "delims=" %%i in ('dir /ad /b "%path2%"') do (
  8.     if not exist "%path2%\%%i\*bak" rd /s /q "%path2%\%%i"
  9. )
  10. pause
复制代码

作者: 77七    时间: 2023-11-21 14:02

  1. @echo off
  2. rem 批处理保存为ansi编码格式
  3. cd /d "d:\test\temp" ||exit
  4. for /d %%d in (*) do (
  5. if /i "%%d" neq "txt" (
  6. rd /s /q "%%d"
  7. ) else (
  8. for /d %%e in ("%%d\*") do (
  9. if not exist "%%e\*bak" (
  10. rd /s /q "%%e"
  11. )
  12. )
  13. )
  14. )
  15. pause
复制代码


注意备份,谨慎使用!
作者: qixiaobin0715    时间: 2023-11-21 14:13

回复 1# 不知道是谁
各管各的挺好的,非要合成一个命令适得其反,搞得又复杂效率又低。
作者: Five66    时间: 2023-11-21 19:39

  1. @echo off
  2. set path1=d:\test\temp
  3. for /d %%a in ("%path1%\*" "%path1%\txt\*") do (
  4. if "%%~dpa" == "%path1%\" (
  5. if not "%%~na" == "txt" rd /s /q "%%a"
  6. ) else (
  7. if not exist "%%a\*bak" rd /s /q "%%a"
  8. )
  9. )
  10. pause
复制代码

作者: /zhqsystem/zhq    时间: 2023-11-21 23:36

本帖最后由 /zhqsystem/zhq 于 2023-11-21 23:39 编辑
  1. for /f "delims=" %%i in ('dir/a-d/s/b ".\bat-*.*"')do if /i not "%%~nxi"=="%~nx0" for /f "delims=" %%j in ("%%~fi\..")do for /f "delims=" %%k in ("%%~fj\..\..")do (
  2. if not defined # set "#=1"&for /f "delims=" %%l in ('dir/ad/b "%%~fk"')do if /i not "%%~nxl"=="TXT" echo,rd/s/q "%%~fk\%%~nxl"
  3. if /i "%%~nxi"=="bat-bak" echo,保留:        %%~fi
  4. if /i "%%~nxi"=="bat-tmp" echo,删除:del/q "%%~fi"&&echo,del/q "%%~fj\*.*"&&echo,rd/q "%%~fj"
  5. )
复制代码

作者: aloha20200628    时间: 2023-11-22 14:25

本帖最后由 aloha20200628 于 2023-11-22 14:38 编辑


根据路径串联的原则,排除与指定路径无串联关系的所有旁支路径...
调用findstr是为保全 *bat-bak\* 的子文件夹
脚本代码设定初始文件夹为 d:\test\temp
当前脚本为验证版本,若验证结果无误,可删除第11行前缀 'REM 实用版本》',再删除9-10行,改为实用版本。
  1. @echo off &setlocal enabledelayedexpansion
  2. cd /d "d:\temp\tmp"
  3. for /f "delims=" %%d in ('dir/b/s/ad *bat-bak') do (set/a "n+=1" &set _!n!=%%d)
  4. for /f "delims=" %%d in ('dir/b/s/ad^|findstr /ivc:"bat-bak" ') do (
  5. set "keep=0" &for /L %%i in (1,1,!n!) do (
  6. set "_d=!_%%i!"
  7. if /i "!_d:%%d=!" neq "!_d!" (set "keep=1")
  8. )
  9. REM 验证版本
  10. if !keep! equ 0 (echo,删除》%%d) else (echo,保留》%%d)
  11. REM 实用版本》if !keep! equ 0 (rd /s/q "%%d"2>nul)
  12. )
  13. endlocal&exit/b
复制代码

作者: 不知道是谁    时间: 2023-11-23 12:48

Five66 发表于 2023-11-21 19:39



    测试可用,也能看明白,学习了




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2