找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 38678|回复: 16

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

[复制链接]
发表于 2024-8-20 18:13:40 | 显示全部楼层 |阅读模式
请教各位大神一个问题,涉及到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.                             )
复制代码
发表于 2024-8-20 18:48:32 | 显示全部楼层
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
发表于 2024-8-20 20:55:39 | 显示全部楼层
修改下楼主的代码:标签不能写在语句内部,判断不等于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
复制代码
发表于 2024-8-20 21:51:21 | 显示全部楼层
回复 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. )
复制代码
发表于 2024-8-20 21:54:19 | 显示全部楼层
回复 1# delab-1


发表于 2024-8-20 22:13:28 | 显示全部楼层
本帖最后由 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
复制代码
 楼主| 发表于 2024-8-20 22:21:20 | 显示全部楼层
回复 2# hnfeng
谢谢,这个思路是将数据先拷贝到一个临时文件夹内,然后将其它文件清除后,再把文件从临时文件中移入,思路很不错
 楼主| 发表于 2024-8-20 22:23:17 | 显示全部楼层
回复 3# 77七


    这个非常精彩,两个不等于的循环很精巧,我去试一试。感谢感谢
 楼主| 发表于 2024-8-20 22:28:35 | 显示全部楼层
回复 5# Batcher


    感谢感谢,这个提示太重要了!
 楼主| 发表于 2024-8-20 22:31:46 | 显示全部楼层
回复 6# aloha20200628


    感谢!思路很好,感谢感谢
发表于 2024-8-20 23:13:17 | 显示全部楼层
回复 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
复制代码
 楼主| 发表于 2024-8-21 00:37:05 | 显示全部楼层
回复 11# ppll2030


    运行了一下,但是结果只是“all_import_12.txt”保留下来了,第一个"all_export_12.txt”还是被删除了,能不能帮助在确认一下?('dir /b ^|findstr /ivc:%f1% /ivc:%f2%')似乎只是去掉了%f2%,而%f1%并未去掉。
发表于 2024-8-21 09:03:23 | 显示全部楼层
本帖最后由 ppll2030 于 2024-8-21 09:09 编辑

回复 12# delab-1


    我的代码没问题。出现f1被删除,那就是定义的f1与你实际的文件名有出入。重新复制你的文件名到代码f1里试试。
还有,你的代码把转义符 ^ 删掉,就可以直接在cmd里测试,%f1%和%f2% 最好加上双引号“ ”,避免文件名有空格等特殊情况识别错误。
 楼主| 发表于 2024-8-21 10:06:04 | 显示全部楼层
回复 13# ppll2030

是的,我又重新写了,应该是表达写的错误,现在运行成功。感谢感谢! :handshake
发表于 2024-8-21 10:50:41 | 显示全部楼层
回复 11# ppll2030


   if 其实挺好的,效率高,而且准确
findstr有点复杂,排除中文、完全排除/x,排除路径等等,都可能出错。我目前在试错阶段,没有掌握
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 21:06 , Processed in 0.023314 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表