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

[文件操作] 求助批处理删除多个文件夹中a和b文件以外的所有文件

请教各位大神一个问题,涉及到if的嵌套使用。问题很简单,在2017,2018,2019,2020,2021,2022,2023的文件夹中,我想删除all_exprot_12.txt和all_import_12.txt以外的所有文件。我编写的程序不能运行,请大神帮助一下。
  1. for /L %%a in (2017,1,2023) do (
  2. cd %%a
  3. dir *.* /b/od >temp.txt
  4. ::-------------------------------------------
  5. for /f %%b in (temp.har) do (
  6. if "%%b"=="all_export_12.txt" (
  7.   goto next
  8. ) else if ("%%b"=="all_import_12.txt"
  9.   goto next
  10. ) else del %%b
  11. :next
  12.                                )
  13. cd..
  14.                             )
复制代码

for /L %%a in (2017,1,2023) do (
  robocopy /s /mov %%a c:\temp_ /xf all_exprot_12.txt all_import_12.txt
)
rd /s /q c:\temp_
pause

TOP

修改下楼主的代码:标签不能写在语句内部,判断不等于a且不等于b再删除
  1. @echo off
  2. cd /d "%~dp0"
  3. for /l %%l in (2017,1,2023) do (
  4. pushd "%%l"
  5. for %%a in (*) do (
  6. if /i "%%a" neq "all_exprot_12.txt" (
  7. if /i "%%a" neq "all_import_12.txt" (
  8. del "%%a"
  9. )
  10. )
  11. )
  12. popd
  13. )
  14. pause
复制代码
bat小白,请多指教!谢谢!

TOP

回复 1# delab-1
  1. @echo off
  2. cd /d "%~dp0"
  3. for /l %%i in (2017,1,2023) do (
  4.     if exist "%%i" (
  5.         for %%a in ("%%i\*") do (
  6.             if /i "%%~nxa" neq "all_exprot_12.txt" (
  7.                 if /i "%%~nxa" neq "all_import_12.txt" (
  8.                     del /f /q "%%a"
  9.                 )
  10.             )
  11.         )
  12.     )
  13. )
复制代码
测试代码之前请做好备份

TOP

回复 1# delab-1


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

TOP

本帖最后由 aloha20200628 于 2024-8-20 23:32 编辑

回复 1# delab-1

以下代码操作流程》
一。先在当前盘创建临时目录 “\_tmp_”
二。将每个目标目录 [2017-2023] 中的两个保留文件先移至临时目录,再一次性删除该目录中的其余所有文件,免去对目录中全部文件的比对删除
三。将临时文件中的两个保留文件恢复原位
四。最后删除临时目录
  1. @echo off &md "\_tmp_" 2>nul &for /L %%d in (2017,1,2023) do (
  2. for %%F in ("all_exprot_12.txt", "all_import_12.txt") do move "%%d\%%~F" "\_tmp_\"
  3. del /q "%%d\*.*" &move "\_tmp_\*.txt" "%%d\"
  4. )
  5. rd /q "\_tmp_" &pause &exit/b
复制代码

TOP

回复 2# hnfeng
谢谢,这个思路是将数据先拷贝到一个临时文件夹内,然后将其它文件清除后,再把文件从临时文件中移入,思路很不错

TOP

回复 3# 77七


    这个非常精彩,两个不等于的循环很精巧,我去试一试。感谢感谢

TOP

回复 5# Batcher


    感谢感谢,这个提示太重要了!

TOP

回复 6# aloha20200628


    感谢!思路很好,感谢感谢

TOP

回复 10# delab-1


    if嵌套越多越麻烦难懂。能不用就不用。
dir+findstr也可以做到排除特定文件
  1. @echo off
  2. set "f1=all_exprot_12.txt"
  3. set "f2=all_import_12.txt"
  4. for /L %%d in (2017,1,2023) do (
  5. pushd "%~dp0%%d"
  6. for /f "delims=" %%i in ('dir /b /s /a-d^|findstr /ivc:"%f1%" /ivc:"%f2%"') do (echo del /q "%%i")
  7. popd
  8. )
  9. pause
复制代码

TOP

回复 11# ppll2030


    运行了一下,但是结果只是“all_import_12.txt”保留下来了,第一个"all_export_12.txt”还是被删除了,能不能帮助在确认一下?('dir /b ^|findstr /ivc:%f1% /ivc:%f2%')似乎只是去掉了%f2%,而%f1%并未去掉。

TOP

本帖最后由 ppll2030 于 2024-8-21 09:09 编辑

回复 12# delab-1


    我的代码没问题。出现f1被删除,那就是定义的f1与你实际的文件名有出入。重新复制你的文件名到代码f1里试试。
还有,你的代码把转义符 ^ 删掉,就可以直接在cmd里测试,%f1%和%f2% 最好加上双引号“ ”,避免文件名有空格等特殊情况识别错误。

TOP

回复 13# ppll2030

是的,我又重新写了,应该是表达写的错误,现在运行成功。感谢感谢! :handshake

TOP

回复 11# ppll2030


   if 其实挺好的,效率高,而且准确
findstr有点复杂,排除中文、完全排除/x,排除路径等等,都可能出错。我目前在试错阶段,没有掌握
bat小白,请多指教!谢谢!

TOP

返回列表