标题: [文件操作] 求助批处理删除多个文件夹中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以外的所有文件。我编写的程序不能运行,请大神帮助一下。- for /L %%a in (2017,1,2023) do (
- cd %%a
- dir *.* /b/od >temp.txt
- ::-------------------------------------------
- for /f %%b in (temp.har) do (
- if "%%b"=="all_export_12.txt" (
- goto next
- ) else if ("%%b"=="all_import_12.txt"
- goto next
- ) else del %%b
-
- :next
- )
- cd..
- )
复制代码
作者: 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再删除
- @echo off
- cd /d "%~dp0"
- for /l %%l in (2017,1,2023) do (
- pushd "%%l"
- for %%a in (*) do (
- if /i "%%a" neq "all_exprot_12.txt" (
- if /i "%%a" neq "all_import_12.txt" (
- del "%%a"
- )
- )
- )
- popd
- )
- pause
复制代码
作者: ShowCode 时间: 2024-8-20 21:51
回复 1# delab-1 - @echo off
- cd /d "%~dp0"
- for /l %%i in (2017,1,2023) do (
- if exist "%%i" (
- for %%a in ("%%i\*") do (
- if /i "%%~nxa" neq "all_exprot_12.txt" (
- if /i "%%~nxa" neq "all_import_12.txt" (
- del /f /q "%%a"
- )
- )
- )
- )
- )
复制代码
作者: 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] 中的两个保留文件先移至临时目录,再一次性删除该目录中的其余所有文件,免去对目录中全部文件的比对删除
三。将临时文件中的两个保留文件恢复原位
四。最后删除临时目录
- @echo off &md "\_tmp_" 2>nul &for /L %%d in (2017,1,2023) do (
- for %%F in ("all_exprot_12.txt", "all_import_12.txt") do move "%%d\%%~F" "\_tmp_\"
- del /q "%%d\*.*" &move "\_tmp_\*.txt" "%%d\"
- )
- 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也可以做到排除特定文件- @echo off
- set "f1=all_exprot_12.txt"
- set "f2=all_import_12.txt"
- for /L %%d in (2017,1,2023) do (
- pushd "%~dp0%%d"
- for /f "delims=" %%i in ('dir /b /s /a-d^|findstr /ivc:"%f1%" /ivc:"%f2%"') do (echo del /q "%%i")
- popd
- )
- 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楼的操作流程可以再合并一步如下- @echo off
- set "f1=all_exprot_12.txt"
- set "f2=all_import_12.txt"
- ( for /L %%d in (2017,1,2023) do dir /b/s/a-d "%%d"|findstr /ivc:"%f1%" /ivc:"%f2%" )>all.1
- for /f "delims=" %%F in (all.1) do del /q "%%F"
- 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 |