Board logo

标题: [文件操作] BAT脚本FOR遍历,删除文件,怎样排除目录和文件? [打印本页]

作者: 7758234    时间: 2023-8-29 14:35     标题: BAT脚本FOR遍历,删除文件,怎样排除目录和文件?

排除C盘下指定目录下所有的PDF DOC XLS文件,进行遍历C盘、D盘、E盘所有PDF、DOC、XLS文件,进行删除处理
作者: 77七    时间: 2023-8-29 15:40

本帖最后由 77七 于 2023-8-29 17:00 编辑
  1. @echo off
  2. rem 批处理保存为ansi编码格式。
  3. for /r "C:\指定目录" %%i in (*.pdf *.doc *.xls) do set _"%%i"=1
  4. for %%a in (c d e) do call :1 "%%a:\"
  5. pause
  6. exit
  7.         :1
  8.         for /r "%~1" %%b in (*.pdf *.doc *.xls) do (
  9.                 if not defined _"%%b" (
  10.                         rem 效果满意,则删除echo再执行
  11.                         echo del "%%b"
  12.                 )
  13.         )
  14.         exit /b
复制代码

代码有问题,参考5楼。
作者: qixiaobin0715    时间: 2023-8-29 15:48

回复 1# 7758234
这种操作还是要小心,一旦删错文件,后悔晚矣!!!
作者: Batcher    时间: 2023-8-29 16:11

回复 1# 7758234


请参考Q-04把bat文件保存为ANSI编码:
https://mp.weixin.qq.com/s/Koje4FufWxWBs7ioDy_LJA
  1. @echo off
  2. REM 设置待排除的目录(注意以\结尾)
  3. set "ExFolder=C:\Users\Administrator\Desktop\"
  4. for %%a in (C D E) do (
  5.     if exist %%a:\ (
  6.         echo 正在搜索%%a:\
  7.         pushd %%a:\
  8.         for /f "delims=" %%b in ('dir /b /s /a-d *.pdf *.doc *.xls 2^>nul ^| find /v /i "%ExFolder%"') do (
  9.             REM 如果显示的结果没有问题,把下面的echo去掉再次执行即可删除文件
  10.             echo del /f /q "%%b"
  11.         )
  12.         popd
  13.     )
  14. )
  15. pause
复制代码

作者: Batcher    时间: 2023-8-29 16:12

回复 2# 77七


    如果待排除的文件较多,可能超出变量上限。
作者: 77七    时间: 2023-8-29 17:00

回复 5# Batcher


   谢谢站长指点!没考虑到指定目录下会存在大量待排除文件。
作者: 77七    时间: 2023-8-29 17:01

本帖最后由 77七 于 2023-8-29 17:08 编辑

重来一个。
  1. @echo off
  2. rem 批处理保存为ansi编码格式。请谨慎使用!
  3. set "folder=C:\指定目录"
  4. for %%a in (pdf doc xls) do attrib +H "%folder%\*.%%a" /s
  5. echo 确认待排除文件隐藏成功,则继续执行
  6. pause
  7. for %%a in (c d e) do (
  8.         pushd "%%a:\"
  9.         del /s /q *.pdf;*.doc;*.xls
  10.         popd
  11. )
  12. for %%a in (pdf doc xls) do attrib -H "%folder%\*.%%a" /s
  13. pause
复制代码

作者: 7758234    时间: 2023-8-29 17:09

回复 7# 77七


    谢谢,这个我看明白了,排除文件添加隐藏属性,好办法,今天又学习了
作者: buyiyang    时间: 2023-8-29 17:46

本帖最后由 buyiyang 于 2023-8-30 11:04 编辑

试试wmic,遍历所有盘
  1. @echo off
  2. rem 指定排除目录
  3. set "exfolder=C:\Windows\"
  4. set "exfolder=%exfolder:\=\\%"
  5. wmic datafile where "not name like '%exfolder%%%' and (Extension='pdf' or Extension='doc' or Extension='xls')" get name /value | findstr .
  6. pause
  7. pause>nul&echo,确认删除?
  8. pause>nul&echo,确认删除?
  9. wmic datafile where "not name like '%exfolder%%%' and (Extension='pdf' or Extension='doc' or Extension='xls')" call delete
复制代码

作者: 7758234    时间: 2023-8-30 10:10

回复 4# Batcher


    站长,您好,请问多个目录要如何配置添加?
作者: 7758234    时间: 2023-8-30 10:29

回复 9# buyiyang


    我测试,执行,提示
节点 - CSG21659Q5
错误:
描述 = 无效查询
请按任意键继续. . .
作者: 7758234    时间: 2023-8-30 10:33

回复 7# 77七


    你好,如果多个目录要如何设置添加
作者: 77七    时间: 2023-8-30 10:43

回复 12# 7758234

  1. @echo off
  2. rem 批处理保存为ansi编码格式。请谨慎使用!
  3. set "folder1=C:\指定目录1"
  4. set "folder2=C:\指定目录2"
  5. for %%a in (pdf doc xls) do (
  6. attrib +H "%folder1%\*.%%a" /s
  7. attrib +H "%folder2%\*.%%a" /s
  8. )
  9. echo 确认待排除文件隐藏成功,则继续执行
  10. pause
  11. for %%a in (c d e) do (
  12.         pushd "%%a:\"
  13.         del /s /q *.pdf;*.doc;*.xls
  14.         popd
  15. )
  16. for %%a in (pdf doc xls) do (
  17. attrib -H "%folder1%\*.%%a" /s
  18. attrib -H "%folder2%\*.%%a" /s
  19. )
  20. pause
复制代码

作者: Batcher    时间: 2023-8-30 11:13

回复 10# 7758234


方法1.bat
  1. @echo off
  2. REM 设置待排除的目录(注意以\结尾)
  3. set "ExFolder1=C:\Users\Administrator\Desktop\"
  4. set "ExFolder2=C:\Program Files\"
  5. for %%a in (C D E) do (
  6.     if exist %%a:\ (
  7.         echo 正在搜索%%a:\
  8.         pushd %%a:\
  9.         for /f "delims=" %%b in ('dir /b /s /a-d *.pdf *.doc *.xls 2^>nul ^| find /v /i "%ExFolder1%" ^| find /v /i "%ExFolder2%" ') do (
  10.             REM 如果显示的结果没有问题,把下面的echo去掉再次执行即可删除文件
  11.             echo del /f /q "%%b"
  12.         )
  13.         popd
  14.     )
  15. )
  16. pause
复制代码

作者: 7758234    时间: 2023-8-30 11:20

回复 14# Batcher


    谢谢
作者: 77七    时间: 2023-8-30 12:10

本帖最后由 77七 于 2023-8-30 12:31 编辑
  1. @echo off
  2. rem 批处理保存为ansi编码格式。路径末尾以 \ 结束
  3. call :1 "c:\指定目录1\"
  4. call :1 "c:\指定目录2\"
  5. call :1 "c:\指定目录3\"
  6. for %%a in (c d e) do call :2 "%%a:\"
  7. pause & exit
  8. :1
  9. set _"%~1"=1
  10. rem 如果不需要排除子目录删除下一行
  11. for /r "%~1" /d %%d in (*) do set _"%%d\"=1
  12. exit /b
  13. :2
  14. for /r "%~1" %%i in (*.pdf *.doc *.xls) do (
  15. if not defined _"%%~dpi" (
  16. echo del "%%i"
  17. )
  18. )
  19. exit /b
复制代码

改进下2楼代码。如果子目录数量过多,还是会存在变量个数超限问题。
单个环境的最大变量大小为 8192 字节。所有变量(包括变量名称和等号)的最大环境变量总大小为 65,536KB。


http://bbs.bathome.net/redirect.php?goto=findpost&ptid=29022&pid=145079
windows路径长度限制260字符。
粗略估算,一般应该不会超限,但是如果子目录数量过万,变量过万,批处理存在效率降低问题。
作者: qixiaobin0715    时间: 2023-8-30 16:56

若指定目录不存在子目录,这样也可。慎用,只是提供一种思路:
  1. @echo off
  2. set "ExFolder1=指定目录1"(完整路径)
  3. set "ExFolder2=指定目录2"(完整路径)
  4. ...
  5. ren "%ExFolder1%\*.*" "*.*.1"
  6. ren "%ExFolder1%\*.*" "*.*.1"
  7. ...
  8. for %%i in (C D F) do (
  9. if exist %%i:\
  10. for %%j in (pdf doc xls) do (
  11. del /s %%i:\*.%%j
  12. )
  13. )
  14. ren "%ExFolder1%\*.*" "*."
  15. ren "%ExFolder2%\*.*" "*."
  16. ...
复制代码

作者: 7758234    时间: 2023-8-31 10:09

回复 14# Batcher


    站长其实我们是有个检查,也不想删除这些文件。我有个想法,批量查找出这些文件,把他们命名和后缀输出到xls文件,批处理将他们后缀删除,后续检查过后,恢复他们的后缀格式名,这样也不影响后面的使用。
作者: Batcher    时间: 2023-8-31 10:38

回复 18# 7758234


备份.bat
  1. @echo off
  2. REM 设置待排除的目录(注意以\结尾)
  3. set "ExFolder1=C:\Users\Administrator\Desktop\"
  4. set "ExFolder2=C:\Program Files\"
  5. REM 导出的文件列表
  6. set "OutFile=%~dp0备份.csv"
  7. REM 设置新的临时后缀名
  8. set "NewExt=ttttt"
  9. >"%OutFile%" echo OldName,NewName
  10. for %%a in (C D E) do (
  11.     if exist %%a:\ (
  12.         echo 正在搜索%%a:\
  13.         pushd %%a:\
  14.         for /f "delims=" %%b in ('dir /b /s /a-d *.pdf *.doc *.xls 2^>nul ^| find /v /i "%ExFolder1%" ^| find /v /i "%ExFolder2%" ') do (
  15.             echo 正在查找 %%b
  16.             >>"%OutFile%" echo "%%b","%%b.%NewExt%"
  17.             REM 如果显示的结果没有问题,把下面的echo去掉再次执行即可重命名文件
  18.             echo ren "%%b","%%~nxb.%NewExt%"
  19.         )
  20.         popd
  21.     )
  22. )
  23. pause
复制代码
恢复.bat
  1. @echo off
  2. set "InFile=%~dp0备份.csv"
  3. for /f skip^=1^ tokens^=3^ delims^=^" %%a in ('type "%InFile%"') do (
  4.     REM 如果显示的结果没有问题,把下面的echo去掉再次执行即可重命名文件
  5.     echo ren "%%a" "%%~na"
  6. )
  7. pause
复制代码

作者: 7758234    时间: 2023-8-31 11:48

回复 19# Batcher


    站长,但是恢复上就有个问题,文件中存在doc、pdf、xls等文件,批量已命令后缀tttt,恢复应该要读备份CSV进行文件命名才行。单纯通过现有BAT搜索*.tttt命名会有问题。
作者: Batcher    时间: 2023-8-31 11:56

回复 20# 7758234


19楼代码已经更新,可以处理同一个文件夹下包含:
测试.doc
测试.pdf
测试.xls
这种情况

恢复的时候,就是要读取csv文件的NewName和OldName进行重命名。直接搜索.ttttt是不好的方法。
作者: 7758234    时间: 2023-8-31 12:24

回复 21# Batcher


    我看了19楼代码了,有点没看懂恢复的处理步骤,改了新命名后,这个批处理怎么去读oldname去恢复
作者: 77七    时间: 2023-8-31 15:31

本帖最后由 77七 于 2023-8-31 15:45 编辑
  1. @echo off
  2. rem 批处理保存为ansi编码格式。路径末尾以 \ 结束
  3. call :1 "c:\指定目录1\"
  4. call :1 "c:\指定目录2\"
  5. call :1 "c:\指定目录3\"
  6. for %%a in (c d e) do call :2 "%%a:\"
  7. pause & exit
  8. :1
  9. set _"%~1"=1
  10. rem 如果不需要排除子目录删除下一行
  11. for /r "%~1" /d %%d in (*) do set _"%%d\"=1
  12. exit /b
  13. :2
  14. for /r "%~1" %%i in (*.pdf *.doc *.xls) do (
  15. if not defined _"%%~dpi" (
  16. >>"重命名.bat" echo ren "%%i" "%%~ni.tttt"
  17. >>"恢复.bat" echo ren "%%~dpni.tttt" "%%~nxi"
  18. )
  19. )
  20. exit /b
复制代码

执行后生成两个bat,重命名和恢复
作者: 7758234    时间: 2023-8-31 16:53

回复 23# 77七


    我添加了排除e:\1 文件夹,命名还是显示有e盘1文件夹下的文件。
作者: 77七    时间: 2023-8-31 17:04

回复 24# 7758234


  
rem 批处理保存为ansi编码格式。路径末尾以 \ 结束
call :1 "c:\指定目录1\"
请按这两行的要求、格式修改。
作者: 7758234    时间: 2023-8-31 17:35

回复 25# 77七

是的,我就是按照这个格式去修改。

    call :1 "e:\1\"
重命名BAT,就有e盘1目录下的文件包括子目录文件
ren "e:\新建 Microsoft Excel 工作表.xls" "新建 Microsoft Excel 工作表.tttt"
ren "e:\1\新建 Microsoft Word 文档.doc" "新建 Microsoft Word 文档.tttt"
ren "e:\1\2\新建 Microsoft Word 文档.doc" "新建 Microsoft Word 文档.tttt"
作者: Batcher    时间: 2023-8-31 18:01

回复 22# 7758234


    请参考19楼:恢复.bat




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