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

[文件操作] BAT脚本FOR遍历,删除文件,怎样排除目录和文件?

排除C盘下指定目录下所有的PDF DOC XLS文件,进行遍历C盘、D盘、E盘所有PDF、DOC、XLS文件,进行删除处理

回复 22# 7758234


    请参考19楼:恢复.bat
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 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"

TOP

回复 24# 7758234


  
rem 批处理保存为ansi编码格式。路径末尾以 \ 结束
call :1 "c:\指定目录1\"
请按这两行的要求、格式修改。
bat小白,请多指教!谢谢!

TOP

回复 23# 77七


    我添加了排除e:\1 文件夹,命名还是显示有e盘1文件夹下的文件。

TOP

本帖最后由 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,重命名和恢复
bat小白,请多指教!谢谢!

TOP

回复 21# Batcher


    我看了19楼代码了,有点没看懂恢复的处理步骤,改了新命名后,这个批处理怎么去读oldname去恢复

TOP

回复 20# 7758234


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

恢复的时候,就是要读取csv文件的NewName和OldName进行重命名。直接搜索.ttttt是不好的方法。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 19# Batcher


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

TOP

回复 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
复制代码
1

评分人数

    • 7758234: 感谢给帖子标题标注[已解决]字样技术 + 1
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 14# Batcher


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

TOP

若指定目录不存在子目录,这样也可。慎用,只是提供一种思路:
  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. ...
复制代码

TOP

本帖最后由 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字符。
粗略估算,一般应该不会超限,但是如果子目录数量过万,变量过万,批处理存在效率降低问题。
bat小白,请多指教!谢谢!

TOP

回复 14# Batcher


    谢谢

TOP

回复 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
复制代码
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

返回列表