标题: [文件操作] 求助,多种条件叠加,过滤后删除指定文件。 [打印本页]
作者: smatenchen 时间: 2023-9-30 21:33 标题: 求助,多种条件叠加,过滤后删除指定文件。
本帖最后由 smatenchen 于 2023-10-1 13:39 编辑
求助,多种条件叠加,过滤后删除指定文件。
方案2:
{条件,
1,同一目录下的一堆文件,1.txt,2.log,3.dat,???aabbxxx???????.gif,xxxxxaabbxxx??????.jpg,c.ini,d.dll,e.inf,……。
2,文件名中x,?都表示是未知字符,……表示还有很多其它文件。
要求,
1,保留1.txt,2.log,和文件名中包含aabb的文件,其余的删除。
2,不使用find,findstr,move。}
方案1:
{条件,
1,同一目录下的一堆文件,1.txt,2.log,3.dat,aabbxxx???????.gif,aabbxxx??????.jpg,c.ini,d.dll,e.inf,……。
2,文件名中x,?都表示是未知字符,……表示还有很多其它文件。
要求,
1,保留1.txt,2.log,和aabb开头的文件,其余的删除。
2,不使用find,findstr,move。}
感谢!
作者: smatenchen 时间: 2023-9-30 21:43
回复 1# smatenchen qixiaobin0715 77七 BAT221110 hfxiang
求助!感谢!
作者: smatenchen 时间: 2023-9-30 21:49
回复 1# smatenchen terse pd1 qixiaobin0715 hfxiang idwma
求助!感谢!
作者: hlzj88 时间: 2023-9-30 21:50
本帖最后由 hlzj88 于 2023-9-30 22:18 编辑
- 有问题,不可用
- md a
- move /y 1.txt a\
- move /y 2.log a\
- move /y aabb*.* a\
- for /f "delims=" %%i in ('dir /b/oe "*.*"') do if %%i==%~nx0 (echo,) else del /q "%%i"
- move /y %~dp0a\*.* %~dp0
- rd /q a
- pause
复制代码
为什么同时把a\的文件也删除了呢?
作者: qixiaobin0715 时间: 2023-9-30 21:57
想法不错,但是第5行bat文件也删除了,后面的命令不知是否还能执行?
作者: smatenchen 时间: 2023-9-30 22:01
回复 4# hlzj88
不能移动文件,用for命令吧。
作者: smatenchen 时间: 2023-9-30 22:03
回复 5# qixiaobin0715
不能移动文件,用for命令吧。
作者: 77七 时间: 2023-9-30 22:10
- @echo off
- rem 批处理保存为ansi编码格式
- for /f "delims=" %%i in ('dir /b /a-d ^|find /v "%~nx0"') do (
- set str=%%i
- setlocal enabledelayedexpansion
- if /i "!str!" neq "1.txt" (
- if /i "!str!" neq "2.log" (
- if "!str:~0,4!" neq "aabb" (
- del "!str!"
- )
- )
- )
- endlocal
- )
- pause
复制代码
作者: smatenchen 时间: 2023-9-30 22:35
回复 8# 77七 qixiaobin0715
感谢!
用了find,findstr,move,问题就很简单了。
还是用for加其它,如dir硬扛吧!
作者: 77七 时间: 2023-9-30 22:44
回复 9# smatenchen
- @echo off
- rem 批处理保存为ansi编码格式
- set me=%~nx0
- for %%i in (*) do (
- set str=%%i
- setlocal enabledelayedexpansion
- if /i "!str!" neq "1.txt" (
- if /i "!str!" neq "2.log" (
- if "!str:~0,4!" neq "aabb" (
- if "!str!" neq "!me!" (
- del "!str!"
- )
- )
- )
- )
- endlocal
- )
- pause
复制代码
作者: smatenchen 时间: 2023-9-30 23:13
回复 4# hlzj88 qixiaobin0715 77七
【为什么同时把a\的文件也删除了呢?】
找到原因了吗?
作者: ppll2030 时间: 2023-9-30 23:50
回复 4# hlzj88
你没有加去除目录参数。*.*等同于*,会把目录也一并罗列出来了。
作者: smatenchen 时间: 2023-9-30 23:52
回复 10# 77七 qixiaobin0715 hlzj88
【if "!str:~0,4!" neq "aabb" (】
巧妙啊!充分利用了文件名特征。我之前没想到这个啊!
再增加难度,aabb在文件名中出现的位置不确定,使用"!str:~0,4!"已不可行了。
这又该如何?
作者: smatenchen 时间: 2023-10-1 00:05
回复 12# ppll2030
【你没有加去除目录参数。*.*等同于*,会把目录也一并罗列出来了。】
好细心啊!了不起啊!
作者: 77七 时间: 2023-10-1 00:26
回复 13# smatenchen
如果是学习的话,可以去教程版块。请不要来回编辑1楼,并且把原来的问题编辑掉。
作者: Five66 时间: 2023-10-1 00:37
回复 13# smatenchen
if "!str:aabb=1!" neq "!str!"
作者: qixiaobin0715 时间: 2023-10-1 08:06
本帖最后由 qixiaobin0715 于 2023-10-1 08:11 编辑
回复 9# smatenchen
真是搞不懂!为什么非要把问题搞复杂化呢,有什么讲究吗?
真应了一句话,叫做“有困难要上,没有困难制造困难也要上”。
好吧,那就在楼主的基础上再增加些难度算了,不使用dir、for、del。
亦或你是在出题吗,那就移步“出题挑战”栏吧。
作者: Batcher 时间: 2023-10-1 08:42
回复 17# qixiaobin0715
【出题挑战】版块的本意是自己已经有一个非常不错的甚至非常优秀的代码,暂时先不发出来,跟大家切磋一下题目
作者: pd1 时间: 2023-10-1 08:46
来了,没有dir for del - powershell -c "ls |%{if($_.Name -eq '1.txt' -or $_.Name -eq '2.log' -or $_.Name -match 'aabb'){}else{Remove-Item $_}}"
复制代码
作者: hfxiang 时间: 2023-10-1 10:33
回复 1# smatenchen
用第3方工具gawk( http://bcn.bathome.net/tool/4.1.0/gawk.exe )在命令行窗口直接执行可实现:- dir /b|gawk "BEGIN{a[\"1.txt\"];a[\"2.log\"];a[\"gawk.exe\"]}!/aabb/{if($0 in a)next;print \"del \042\"$0\"\042\"}"|cmd.exe
复制代码
作者: terse 时间: 2023-10-1 11:11
- @echo off&setlocal enabledelayedexpansion
- set "1.txt=1"
- set "2.log=1"
- set "%~nx0=1"
-
- for /f "delims=" %%i in ('dir /b /a-d') do (
- set "str=%%i"
- if not defined !str! (
- if "!str!" equ "!str:aabb=!" del "!str!"
- )
- )
复制代码
作者: 77七 时间: 2023-10-1 14:36
使用attrib设置文件属性,使用del删除指定属性文件,这样只用两个命令
作者: smatenchen 时间: 2023-10-1 15:12
回复 16# Five66
回复 21# terse
感谢!
【Five66】的【 if "!str:aabb=1!" neq "!str!"】应该写成【terse】的【if "!str!" equ "!str:aabb=!"】吧?
【!str:aabb=1!"】中的【=1!】可简化成【=!】,即【!str:aabb=!"】吧?
请回复!
作者: smatenchen 时间: 2023-10-1 15:29
回复 22# 77七
感谢!
修改文件属性,破坏性太大,影响文件写入。不知文件之前的属性,修改后如何恢复?
条件里的文件名中包含aabb的文件的完整文件名是未知的,仍需用命令把它们找出来。
把文件找出来,再恢复属性……,这么多操作,只用两个命令,不可行。
改动文件,这样的操作,不可行。
作者: smatenchen 时间: 2023-10-1 15:34
回复 17# qixiaobin0715 hlzj88 77七 ppll2030 Five66 pd1 hfxiang terse
回复 18# Batcher
感谢!
事情是这样的,
我遇到了1个问题,如第1楼,开始我想用for,dir,del,if……去解决,后觉得很困难,就用了findstr,当然问题就解决了。
但心里不满意,只能借用findstr吗?还有其它路吗?昨天试了2,3个小时,总算试出来了。
又总觉得这样的东西是自己闭门创出来的(这很受益于之前在论坛跟其他大牛学到的技艺),不献出来与人切磋一下实在可惜了!
于是把问题抽象化后发到论坛来引玉,看看是否还有更高明的解法。
万没想到被【77七】用【if "!str:~0,4!" neq "aabb" (】给四两拨了,我试了几个小时,【77七】只用简单一行就破了,这太难接受了!
不行,得再加大难度,别人也得花几个小时才能破才行。于是把文件名的特征再复杂化一点,我倒要看看你们再怎么破它。嘿嘿!
令人欣喜的是,
果然把【77七】引玉出来了,用【77七】的【if "!str:~0,4!" neq "aabb" (】已足以解决我最初遇到的问题了。
用【Five66】和【terse】的【if "!str:aabb=!" equ "!str!"】就更绝了,堪称完美!而我的则显得笨拙多了,不灵巧。
吧里是真有高人,大牛啊!
1是用findstr,2是用【77七】的【if "!str:~0,4!" neq "aabb" (】,都可以很好地解决问题。
3是用繁琐,但通用(并不比用findstr更通用,但比用【if "!str:~0,4!" neq "aabb" (】更通用)的方案。
4是用【Five66】和【terse】的【if "!str:aabb=!" equ "!str!"】,堪称完美!
还有没有第5套方案呢?
这的确就是【qixiaobin0715】的“出题挑战”,和【Batcher】的切磋一下啊!
我自横刀向天笑,去留肝胆两昆仑!问今天下,舍你其谁?
各位开席吧!哈哈!
作者: 77七 时间: 2023-10-1 15:44
回复 24# smatenchen
复制代码
查看下怎么使用,我觉得你凭空臆想的问题,可能不会存在
作者: Five66 时间: 2023-10-1 18:36
回复 23# smatenchen
【 if "!str:aabb=1!" neq "!str!"】跟【if "!str!" equ "!str:aabb=!"】都差不多吧,区别大概就是走if还是else,甚至可以换成用if not
【!str:aabb=1!"】中的【=1!】是为了懒得思考特殊情况可能造成的影响,如果代码不会因为变量str只有aabb之类的而对其他代码造成影响的话,完全可以简化成【!str:aabb=!"】
其实还是可以通过rename变换文件名的特征,照常使用【if "!str:~0,4!" neq "aabb" 】的,又或者连【if "!str:~0,4!" neq "aabb" 】都可以不用
最简单的应该还是文件属性吧,即从文件名的筛选变换到文件属性的筛选
作者: smatenchen 时间: 2023-10-1 19:16
本帖最后由 smatenchen 于 2023-10-1 19:19 编辑
回复 27# Five66
感谢!
1,
用neq还是equ的确都行,差别在代码简捷程度。
2,
【!str:aabb=1!"】中是【=1!】或是【=!】,我测试了一下,影响不大,差别还是在代码简捷程度。
3,
【其实还是可以通过rename变换文件名的特征】,这个怎么弄的?请赐教!
4,
修改文件属性,不好吧?影响文件写入啊!具体怎么弄的?请赐教!
可以不用【if "!str:~0,4!" neq "aabb" 】?具体怎么弄的?请赐教!
受益匪浅哩!
作者: Five66 时间: 2023-10-1 21:25
回复 28# smatenchen
通过rename给符合要求的文件名附加aabb___前缀,然后用if "!str:~0,4!" neq "aabb"判断,完事之后rename回去
同样的,通过rename给符合要求的文件名附加自定义拓展名,直接用自定义拓展名来判断,完事之后去掉自定义拓展名rename回去
文件属性大概是文件中的一个标记吧,像隐藏文件就只是拥有隐藏标记的文件,修改文件属性估计比改名还要快捷
直接用attrib命令给符合要求的文件添加隐藏属性(del命令好像不识别隐藏文件),完事后再去掉隐藏属性
作者: smatenchen 时间: 2023-10-1 21:50
回复 29# Five66
感谢!
【通过rename给符合要求的文件名附加aabb___前缀,然后用if "!str:~0,4!" neq "aabb"判断,完事之后rename回去】
请写出一下具体代码!
作者: Five66 时间: 2023-10-1 22:21
回复 30# smatenchen
@echo off
set "self=%~nx0"
rename 1.txt aabb____1.txt
rename 2.log aabb____2.log
for /f "delims=" %%i in ('dir /b /a-d *aabb*.*') do rename "%%i" "aabb____%%i"
for %%i in (*) do (
set str=%%i
setlocal enabledelayedexpansion
if "!str:~0,4!" neq "aabb" (
if "!str!" neq "!self!" (
del "!str!"
)
)
endlocal
)
for %%i in (*) do (
set str=%%i
setlocal enabledelayedexpansion
if "!str!" neq "!self!" rename "!str!" "!str:~7!"
endlocal
)
作者: Five66 时间: 2023-10-1 22:59
回复 31# Five66
啊,顺序搞错了
rename 1.txt aabb____1.txt
rename 2.log aabb____2.log
for /f "delims=" %%i in ('dir /b /a-d *aabb*.*') do rename "%%i" "aabb____%%i"
换成
for /f "delims=" %%i in ('dir /b /a-d *aabb*.*') do rename "%%i" "aabb____%%i"
rename 1.txt aabb____1.txt
rename 2.log aabb____2.log
作者: smatenchen 时间: 2023-10-2 08:53
回复 31# Five66
回复 32# Five66
感谢!
1,
你也发现了这个顺序bug。
2,
【if "!str!" neq "!self!" rename "!str!" "!str:~7!"】里的【"!str:~7!"】应该改成【"!str:~8!"】。
3,
代码这么多,不简捷,肯定不如【if "!str!" equ "!str:aabb=!"】的方案。不实用,探讨,拓展一下方案还行。
作者: pd1 时间: 2023-10-3 10:38
是只要纯批的?就判断3个条件而已,or一下就行。
19 20 的不简洁吗
作者: terse 时间: 2023-10-3 14:52
powershell不够简洁吗- powershell -c "Remove-Item * -Exclude 1.txt,2.log,*aabb*, '%~nx0'"
复制代码
作者: smatenchen 时间: 2023-10-4 00:54
回复 34# pd1
回复 35# terse
感谢!
1,
纯批的感觉很舒服,的确是简单判断3个条件就行了,我之前想得复杂了。
2,
powershell的更简捷,可惜我还没学,不会用啊!
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |