Board logo

标题: [文件操作] 求助批处理删除多个文件夹中a和b文件以外的所有文件 [打印本页]

作者: delab-1    时间: 2024-8-20 18:13     标题: 求助批处理删除多个文件夹中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.                             )
复制代码

作者: hnfeng    时间: 2024-8-20 18:48

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
作者: 77七    时间: 2024-8-20 20:55

修改下楼主的代码:标签不能写在语句内部,判断不等于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
复制代码

作者: ShowCode    时间: 2024-8-20 21:51

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

作者: Batcher    时间: 2024-8-20 21:54

回复 1# delab-1



作者: aloha20200628    时间: 2024-8-20 22:13

本帖最后由 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
复制代码

作者: delab-1    时间: 2024-8-20 22:21

回复 2# hnfeng
谢谢,这个思路是将数据先拷贝到一个临时文件夹内,然后将其它文件清除后,再把文件从临时文件中移入,思路很不错
作者: delab-1    时间: 2024-8-20 22:23

回复 3# 77七


    这个非常精彩,两个不等于的循环很精巧,我去试一试。感谢感谢
作者: delab-1    时间: 2024-8-20 22:28

回复 5# Batcher


    感谢感谢,这个提示太重要了!
作者: delab-1    时间: 2024-8-20 22:31

回复 6# aloha20200628


    感谢!思路很好,感谢感谢
作者: ppll2030    时间: 2024-8-20 23:13

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

作者: delab-1    时间: 2024-8-21 00:37

回复 11# ppll2030


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

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

回复 12# delab-1


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

作者: delab-1    时间: 2024-8-21 10:06

回复 13# ppll2030

是的,我又重新写了,应该是表达写的错误,现在运行成功。感谢感谢! :handshake
作者: 77七    时间: 2024-8-21 10:50

回复 11# ppll2030


   if 其实挺好的,效率高,而且准确
findstr有点复杂,排除中文、完全排除/x,排除路径等等,都可能出错。我目前在试错阶段,没有掌握
作者: ppll2030    时间: 2024-8-21 10:57

回复 15# 77七


   
    一两个还好,多了逻辑跟不上。
对于自己就是尽量避免吧。
findstr也是有问题,但是可以和find互补。反正是为了达成目的。那个行就用那个。
作者: aloha20200628    时间: 2024-8-21 11:30

本帖最后由 aloha20200628 于 2024-8-21 11:41 编辑


11楼的操作流程可以再合并一步如下
  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 dir /b/s/a-d "%%d"|findstr /ivc:"%f1%" /ivc:"%f2%" )>all.1
  5. for /f "delims=" %%F in (all.1) do del /q "%%F"
  6. del /q "all.1" &pause &exit/b
复制代码
另说》本帖题型虽不复杂,但几个不同版本的纯P代码值得玩味其中的操作步骤强度,也算是一个简单的作业量计算吧,仅供参考。至于最终的效率差别,还要看实况验证了...

不同版本的纯P作业量简单计算》
6个子目录 2017-2023,每个子目录有2个保留文件,假设每个子目录的文件数是 100
     01楼代码需要 比较+删除 = 6*100+6*(100-2) = 1188;
     06楼代码需要 创建+移动+删除 = 1+6*(2+1)+6+1 = 26;
     11楼代码需要 创建+删除 = 6+6*(100-2) = 594;
     02楼代码调用专用工具 robocopy 整体封装移动删除,不去议论了...





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