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

[文件操作] 求助批处理如何用for命令删掉除了最前,最后的其余文件?

本帖最后由 smatenchen 于 2022-6-2 16:16 编辑



求助——如何用for命令删掉除了最前,或者最后的其余文件?


求助


各位大神:


假定d:\下有n个文件,如何用for命令删掉,


1
除了最前2个之外的其余的文件?


2
或者,除了最后2个之外的其余的文件?


在线等,感谢!

本帖最后由 smatenchen 于 2022-9-7 10:16 编辑

回复 53# qixiaobin0715

回复 34# Batcher

回复 12# smss

回复 28# hfxiang

回复 48# WHY

1,
哈哈哈!


2,
我是光说不练耍把式的,只能是在嘴上说说的呀!


3,
说到学习,这个迭代解法,我也才是在这两天跟你这个大神学习了后才明白其中的窍门的。
那个大神WHY,更是简省了一下迭代解法的代码,了不起啊!
其他大神如smss,hfxiang等,也都是牛人一个啊,所写的代码,很有创意,深受启发啊!
坛主大神Batcher,热心为我这样的初学者,提供教案,感谢啊!


4,
论技巧,我见过的应用例子,肯定没有你们这些大神们见过的多,大神们的经验肯定要丰富得多啊!


感谢大神们贡献出了不少你们的经验,技巧!受益匪浅啊!

TOP

112233...,挥毫指点江山。不要总是猜嘛,把你猜的想法总结为简洁代码,贴出来让大家学习学习。

TOP

回复 51# qixiaobin0715

回复 48# WHY

回复 41# Batcher

1,
非常感谢!

2,

{
@echo off
setlocal enabledelayedexpansion
REM 删除第1行,倒数第1行


for /f "skip=1 delims=" %%i in ('dir /b /a-d *.pdf') do (
    if defined file echo;del "!file!"
    set "file=%%i"
)
pause
}

这个解法巧妙,很是赞叹!

3,

{
@echo off
setlocal enabledelayedexpansion
REM 删除第1/3/5行,倒数第1/3/5行


for /f %%i in ('dir /b *.pdf ^| find /c /v ""') do (
    set /a n=%%i+1, n1=n-1, n3=n-3, n5=n-5
)
for %%i in (1,3,5,!n1!,!n3!,!n5!) do set _%%i=1


for /f "delims=" %%i in ('dir /b *.pdf') do (
    set /a i+=1
    if not defined _!i! echo;del "%%i"
)
pause
}

其中,('dir /b *.pdf ^| find /c /v ""'),这招很怪,剑走偏锋。

4,
后两个for循环,有些繁琐,之前我就看到大神们爱写这样的代码,这显出后面既有解法的影子蛮深。

5,
set /a i+=1
前面已用了%%i,这里再设i+=1,易混淆,这是小瑕疵。
_%%i,_!i!,这些变量反复去设定,再用if去判断,实在是有点繁琐,我猜是可以再巧妙一点的。

TOP

繁琐吗?我倒觉得48楼是最好的代码。“既有解法的影响”?没看出来。

TOP

回复 48# WHY

回复 47# qixiaobin0715

回复 41# Batcher

{
@echo off
setlocal enabledelayedexpansion
REM 删除第1行,倒数第1行


for /f "skip=1 delims=" %%i in ('dir /b /a-d *.pdf') do (
    if defined file echo;del "!file!"
    set "file=%%i"
)
pause
}


1,
非常感谢!


2,
另一种迭代解法,代码更精简了。


{
@echo off
setlocal enabledelayedexpansion
REM 删除第1/3/5行,倒数第1/3/5行


for /f %%i in ('dir /b *.pdf ^| find /c /v ""') do (
    set /a n=%%i+1, n1=n-1, n3=n-3, n5=n-5
)
for %%i in (1,3,5,!n1!,!n3!,!n5!) do set _%%i=1


for /f "delims=" %%i in ('dir /b *.pdf') do (
    set /a i+=1
    if not defined _!i! echo;del "%%i"
)
pause
}


3,
('dir /b *.pdf ^| find /c /v ""')
这种用法,这是第一次见到。


4,
后两个for循环,略显繁琐,受了既有解法的影响,我猜还可以有更轻巧的解法。


5,
感谢写出了这么多的解法,又再次拓宽,丰富了我的解法思路了。


多谢!

TOP

回复 47# qixiaobin0715

回复 41# Batcher


{
@echo off
setlocal enbledelayedexpansion
for %%i in (*.txt) do (
    set /a num+=1
    if !num! gtr 5 (
        set "n0=!n1!"
        set "n1=!n2!"
        set "n2=!n3!"
        set "n3=!n4!"
        set "n4=!n5!"
        set "n5=%%i"
        del "!n0!" 2>nul
    ) else (
        if !num! neq 1 if !num! neq 3 if !num! neq 5 del "%%i"
    )
)
del "!n2!" "!n4!"
}


1,
非常感谢!


2,
可以拓宽解法思路,作为一种新的解法思路来练习,来增加技巧,知识。说不定哪天就用得着呢!


3,
我现在可以看得懂你的代码了,其思路很清楚。
不错,用if句加迭代完成了取舍,最后删了倒数的第2,4个,留下了倒数的第1,3,5个,
用else句保留了前第1,3,5个。


4,
我想了一下,反向迭代解法,应是不可行的,那相当于是时光倒流。这样,看来就只能是正向迭代了。

TOP

本帖最后由 WHY 于 2022-9-1 14:42 编辑
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. REM 删除第1行,倒数第1行
  4. for /f "skip=1 delims=" %%i in ('dir /b /a-d *.pdf') do (
  5.     if defined file echo;del "!file!"
  6.     set "file=%%i"
  7. )
  8. pause
复制代码
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. REM 删除第1/3/5行,倒数第1/3/5行
  4. for /f %%i in ('dir /b *.pdf ^| find /c /v ""') do (
  5.     set /a n=%%i+1, n1=n-1, n3=n-3, n5=n-5
  6. )
  7. for %%i in (1,3,5,!n1!,!n3!,!n5!) do set _%%i=1
  8. for /f "delims=" %%i in ('dir /b *.pdf') do (
  9.     set /a i+=1
  10.     if not defined _!i! echo;del "%%i"
  11. )
  12. pause
复制代码

TOP

本帖最后由 qixiaobin0715 于 2022-9-1 12:19 编辑

总感觉这样的问题实际意义不大,只是练练手而已:
  1. @echo off
  2. setlocal enbledelayedexpansion
  3. for %%i in (*.txt) do (
  4.     set /a num+=1
  5.     if !num! gtr 5 (
  6.         set "n0=!n1!"
  7.         set "n1=!n2!"
  8.         set "n2=!n3!"
  9.         set "n3=!n4!"
  10.         set "n4=!n5!"
  11.         set "n5=%%i"
  12.         del "!n0!" 2>nul
  13.     ) else (
  14.         if !num! neq 1 if !num! neq 3 if !num! neq 5 del "%%i"
  15.     )
  16. )
  17. del "!n2!" "!n4!"
复制代码

TOP

回复 45# qixiaobin0715

回复 41# Batcher

回复 12# smss

回复 28# hfxiang


{
@echo off
(dir /b /a-d *.txt|findstr /n .*|findstr /b "[135]:"
dir /b /a-d /o-n *.txt|findstr /n .*|findstr /b "[135]:")>a.log
for /f "tokens=2 delims=:" %%i in (a.log) do set _%%i=true
del a.log
for %%i in (*.txt) do (
    if not defined _%%i (
        del /f /q "%%i"
    )
)
}


1,
非常感谢!


2,
这个解法基本上没问题,只是有点小瑕疵。
"tokens=2 delims=:"
从这里之后会有点问题,若文件名里有空格,经过前面的操作后,在这步之后会有一点问题冒出来。


3,
我刚到论坛来发帖求助时,你也是用这个 |findstr /n .*| 在帮我解决难题,我蛮熟悉的,对此。


4,
我泡在论坛里这么久后,跟各位大神学了一些技巧,已有了一点进步了。
非常感谢各位大神!


5,
我想出了更灵巧的解法,应该要更简捷一些,可惜不能只用迭代解法去实现。


6,
我猜想出反向迭代的概念,能帮我实现一下吗?试出反向迭代的应用例子来。
拜谢!

TOP

本帖最后由 qixiaobin0715 于 2022-8-31 11:10 编辑

回复 37# smatenchen
第12条,用到了临时文件,未测试,不知这样行否:
  1. @echo off
  2. (dir /b /a-d *.txt|findstr /n .*|findstr /b "[135]:"
  3. dir /b /a-d /o-n *.txt|findstr /n .*|findstr /b "[135]:")>a.log
  4. for /f "tokens=2 delims=:" %%i in (a.log) do set _%%i=true
  5. del a.log
  6. for %%i in (*.txt) do (
  7.     if not defined _%%i (
  8.         del /f /q "%%i"
  9.     )
  10. )
复制代码
刚才不小心参数写错了,重新发一遍。

TOP

回复 43# qixiaobin0715

TOP

有些回帖比较随意,又与其他帖子没什么联系,觉得又没什么用处,就删除掉了,习惯而已。

TOP

本帖最后由 smatenchen 于 2022-8-30 18:34 编辑

回复 41# Batcher

回复 35# qixiaobin0715


{
@echo off
cd /d "%~dp0"
for /f "delims=" %%i in ('dir /b /a-d *.txt') do (
    if not defined First (
        set "First=%%i"
    )
    set "Last=%%i"
)
for /f "delims=" %%i in ('dir /b /a-d *.txt') do (
    if "%%i" neq "%First%" (
        if "%%i" neq "%Last%" (
            del /f /q "%%i"
        )
    )
)
}


1,
非常感谢!


2,
探讨了这多久后,大神又写出了精优版的解法代码。感谢啊!


3,
重要的是解法思路,令我受益良多,大大拓宽了思考方法范围啊!


4,
qixiaobin0715,大神既已回复了新内容,何故又删了呢?


5,
我在本帖里还提出了好几个其它问题,两位大神有空时请帮忙写一下解法代码啊!


拜谢!

TOP

回复 12# smss


也可以不使用变量延迟扩展:
  1. @echo off
  2. cd /d "%~dp0"
  3. for /f "delims=" %%i in ('dir /b /a-d *.txt') do (
  4.     if not defined First (
  5.         set "First=%%i"
  6.     )
  7.     set "Last=%%i"
  8. )
  9. for /f "delims=" %%i in ('dir /b /a-d *.txt') do (
  10.     if "%%i" neq "%First%" (
  11.         if "%%i" neq "%Last%" (
  12.             del /f /q "%%i"
  13.         )
  14.     )
  15. )
复制代码
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

返回列表