Board logo

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

作者: smatenchen    时间: 2022-5-27 09:51     标题: 求助批处理如何用for命令删掉除了最前,最后的其余文件?

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



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


求助


各位大神:


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


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


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


在线等,感谢!


作者: Batcher    时间: 2022-5-27 10:42

回复 1# smatenchen


    最前、最后是按照什么排序的呢?文件名?修改时间?大小?
作者: qixiaobin0715    时间: 2022-5-27 10:51

如果是按文件名排序,而其中有涉及到数字序号,有时顺序可能与你所看到会有较大的差异。
作者: smatenchen    时间: 2022-5-27 23:21

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

回复 2# Batcher


大神们好,


文件排序不是最重要的,都是会用到dir命令去显示排序结果。


鄙人最在意的是,如何保留了所需,而又剔除了其余……。


这是挺重要的操作,如,有一大堆记录文件,只需保留最前,或者最后几个,其余要删掉。


这要如何实现呢?是要多重用到set命令吗?


请大神们帮助!

作者: smatenchen    时间: 2022-5-27 23:21

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

回复 3# qixiaobin0715


大神们好,


文件排序不是最重要的,都是会用到dir命令去显示排序结果。


鄙人最在意的是,如何保留了所需,而又剔除了其余……。


这是挺重要的操作,如,有一大堆记录文件,只需保留最前,或者最后几个,其余要删掉。


这要如何实现呢?是要多重用到set命令吗?


请大神们帮助!

作者: smatenchen    时间: 2022-5-27 23:21

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

大神们好,

文件排序不是最重要的,都是会用到dir命令去显示排序结果。

鄙人最在意的是,如何保留了所需,而又剔除了其余……。

这是挺重要的操作,如,有一大堆记录文件,只需保留最前,或者最后几个,其余要删掉。

这要如何实现呢?是要多重用到set命令吗?

请大神们帮助!

作者: xczxczxcz    时间: 2022-5-28 10:08

帖个图给大佬们看,他们才知道你的dir是什么样子的。
作者: smatenchen    时间: 2022-5-28 22:56

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



没人会解法吗?

作者: smatenchen    时间: 2022-5-29 10:05

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

回复 7# xczxczxcz


   一般的dir命令,如dir /b /a:-d这样的命令。

作者: smatenchen    时间: 2022-5-29 11:51

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



1
先感谢大神出手相助。


2
的确,鄙人有没把需求说清楚的地方。
在一些地方,少说了或者两字,以致于把条件或,含混地说成了条件与。
是鄙人,说的不周圆。是鄙人的错。


3
大神批命令里的,
>1.log应不妥,该是>>1.log吧?
setlocal enabledelayedexpansion,没用到延迟,这句可不用吧?
(for /f,为何前面加个(呢?,这是要与>1.log配套使用的吗?
加了(,就等于>>1.log吗?就是将for命令的结果整个地输入给1.log吗?
这么多窍门吗?鄙人,又学几招了。哈哈!感谢!


4
非常感谢大神,给了提示。
sort命令也用上了,巧妙啊!谢谢!
鄙人之前忽略了skip参数,过去没理解透它。谢谢大神的提示。
鄙人,因而,有解法思路了。


5
看完大神的这个批命令,鄙人觉得,应该是会把所有txt文件删光吧?
这应该不能实现删掉除了最前2个,以及最后2个之外的其余文件吧?


6
假如,要删掉a.log文件里,除了最前2行,或最后2行外的其余行,这要如何实现呢?
有对文本内容编辑的命令吗?
假如,条件变一下,要删掉除了最前2行,及最后2行外的其余行,又该如何实现呢?
求帮助!谢谢!

作者: smss    时间: 2022-5-29 15:18

假定最前文件叫张三 最后文件叫李四
  1. @Echo off
  2. for /r %%i in (*)do if not "%%~nxi"=="%~nx0" if not "%%~nxi"=="张三.txt" if not "%%~nxi"=="李四.png" del/s/q "%%i"
  3. pause
复制代码

作者: smss    时间: 2022-5-29 15:39

假定按名称排列
  1. @Echo off&SetLocal EnableDelayedExpansion&set n=0
  2. for /r %%i in (*)do (
  3. if not "%%~nxi"=="%~nx0" (set /a n+=1
  4. if "!n!"=="1" set L=%%i
  5. set J=%%i
  6. )
  7. )
  8. for /r %%i in (*)do if not "%%~nxi"=="%~nx0" if not "%%i"=="!L!" if not "%%i"=="!J!" del/s/q "%%i"
  9. pause
复制代码

作者: arwind    时间: 2022-5-29 17:12

回复 2# Batcher


   论坛有点问题发不了新贴了,分类无论选什么点发新话题都提示:您没有输入标题或内容,请返回填写。
尝试过chrome和firefox都是。。
作者: smatenchen    时间: 2022-5-29 17:37

回复 12# smss


   1
大神,
可以解释一下你的for命令里,各条语句的具体含义吗?
鄙人实在是看不太懂。
谢谢!
作者: smatenchen    时间: 2022-5-29 17:40

回复 13# arwind


   
作者: Batcher    时间: 2022-5-29 18:00

回复 13# arwind


请到站务版块单独发个帖子吧
http://bbs.bathome.net/forumdisplay.php?fid=40

如果需要上传截图,可以找个图床,例如:
http://bbs.bathome.net/thread-60985-1-1.html
作者: smatenchen    时间: 2022-5-29 18:32

回复 11# smss


   1
先感谢大神出手相助。


2
请教,
%%~nxi,这是一种什么变量?请详教一下。


3
条件,
假定某文件夹里有一大堆文件,不知道其文件数量和文件名,因为这个文件夹里的文件
是会每天增加的,新文件名也是会不断依序出现的。
所以,用去比较文件名的解法,是行不通的。
作者: qixiaobin0715    时间: 2022-5-30 10:33

回复 10# smatenchen
代码发上去之后,看楼主没有回应,我想可能对楼主的需求理解错误,所以就将原贴删除了,并且也未留下备份。
代码的主要思路是:
1.前2个for循环利用skip,分别忽略前n个txt文件将其余txt文件名保存在1.log中,忽略后n个txt文件将其余txt文件名保存在2.log中;
2.第3个for循环是利用findstr命令取2个log文件中交集(而非并集),即取掐头去尾后位于中间的txt文件名,利用del命令删除这些文件。
关于楼主几点疑问的回复:
1.此处确实可以不使用变量延迟功能;
2.至于是否会把所有txt文件全部删除,这里不用争论,因为这是一个实践性非常强的知识,试一试即知。并且在上面思路的第2点已经说的很清楚了。
3.我觉得楼主对重定向命令理解是浮在表面。在这里可以举个简单的例子,如果用我上面的代码不好理解,我将for循环中能够显示的内容拆分开来,可能看的较为明白,自己去测试一下:
  1. (
  2. echo,1
  3. echo,2
  4. echo,3
  5. echo,4
  6. echo,5
  7. )>a.txt
复制代码
看看a.txt里的内容是什么?
把上面代码括号中的多行替换成:
  1. (
  2. for /l %%a in (1,1,5) do (
  3. echo,%%a
  4. )
  5. )>a.txt
复制代码
看看2段代码是不是等价的?
作者: qixiaobin0715    时间: 2022-5-30 12:00

保留前面2个txt文件,删除其余txt文件:
  1. for /f "skip=2 delims=" %%i in ('dir /b /a-d *.txt') do del "%%i"
复制代码
保留后面2个txt文件,删除其余txt文件:
  1. for /f "skip=2 delims=" %%i in ('dir /b /a-d *.txt^|sort /r') do del "%%i"
复制代码

作者: Batcher    时间: 2022-5-30 14:26

回复 17# smatenchen


%%~nxi的用法,参考for命令教程第6页:
http://bbs.bathome.net/thread-31727-1-1.html
作者: smatenchen    时间: 2022-5-30 15:09

回复 20# Batcher



1
感谢坛主出手相教!
谢谢!
作者: smatenchen    时间: 2022-5-30 15:15

回复 19# qixiaobin0715


1
感谢大神出手相教!
鄙人后来也想出了这个解法,现已测试,可用了。
谢谢!

作者: smatenchen    时间: 2022-5-30 15:33

回复 18# qixiaobin0715



1
大神好!感谢!


2
你之前的那个代码,
第1个for命令,把第3到第10个txt文件名存入1.log里。
第2个for命令,把第8到第1个txt文件名存入2.log里。
第3个for命令,用1.log里的行分别查找2.log里的行,取了交集,再交给%%i,去do,去del。
之前,是鄙人理解错误了!


3
只排除最前2个,或最后2个而删其它文件的解法,鄙人已有了。
感谢提示。


4
type命令输出的结果,可以用管道给其它命令做输入吗?


5
用for /f命令,可以做到,只读取第n行,而忽略其它行吗?
作者: smatenchen    时间: 2022-6-2 17:16

回复 12# smss Batcher qixiaobin0715



1
感谢大神!


2
if not "%%~nxi"=="%~nx0" (set /a n+=1
if "!n!"=="1" set L=%%i
set J=%%i
这句是什么意思?
若列举的第一个文件不是批处理文件本身,就开始计数。
第一个非批处理文件本身的要处理的文件,交给变量L,接着又交给变量J。这里是省了else吗?
没看懂其中的逻辑,能解释一下吗?


3
第2个for命令,不是!L!,不是!J!,就del?
没看懂其中的逻辑,能解释一下吗?


4
其他大神,有看懂了的吗?能帮忙解释一下吗?
作者: smatenchen    时间: 2022-6-2 17:19

回复 18# qixiaobin0715



1
感谢大神!
作者: smatenchen    时间: 2022-6-2 17:25

回复 19# qixiaobin0715



1
感谢大神!


2
有效,可行!
作者: smatenchen    时间: 2022-8-14 20:20

回复 12# smss

{
@Echo off&SetLocal EnableDelayedExpansion&set n=0
for /r %%i in (*)do (

if not "%%~nxi"=="%~nx0" (set /a n+=1


if "!n!"=="1" set L=%%i


set J=%%i


)

)
for /r %%i in (*)do if not "%%~nxi"=="%~nx0" if not "%%i"=="!L!" if not "%%i"=="!J!" del/s/q "%%i"

pause
}


1,
不错的思路!但这些命令还没写完整啊!


2,
此外,对于要保留最后2个文件而删除其它文件,这个方法,还有用吗?
作者: hfxiang    时间: 2022-8-15 08:46

本帖最后由 hfxiang 于 2022-8-15 09:00 编辑

1.只保留最先的2个,其它删除
  1. for /f "skip=2 tokens=*" %a in ('dir /b/a-d/s') do @del/f/s/q "%a"
复制代码
2.只保留最后2个,则dir指令倒排序好可
  1. for /f "skip=2 tokens=*" %a in ('dir /b/a-d/s/o-n') do @del/f/s/q "%a"
复制代码

作者: smatenchen    时间: 2022-8-20 09:21

回复 12# smss

回复 24# smatenchen

回复 2# Batcher

回复 19# qixiaobin0715

回复 28# hfxiang

{
@Echo off&SetLocal EnableDelayedExpansion&set n=0
for /r %%i in (*)do (

if not "%%~nxi"=="%~nx0" (set /a n+=1


if "!n!"=="1" set L=%%i


set J=%%i


)

)
for /r %%i in (*)do if not "%%~nxi"=="%~nx0" if not "%%i"=="!L!" if not "%%i"=="!J!" del/s/q "%%i"

pause
}


1,
非常感谢!


2,
今日,再来一看大神的代码,顿觉精妙,因为我认为我这才看懂了大神的代码啊!


3,
这真是一种奇妙的解法思路啊!大大拓宽了解题思路了!妙!妙!
归结一下精妙之处,伴行参量。


4,
我依旧还有些疑问,请大神赐教。


5,
if "!n!"=="1" set L=%%i
L被定为第1个了,当然M也可以接着被定为第2个……。


6,
set J=%%i
这样,J应该就是最后一个了,前面J被定义的值都会被替换为最后那个值了。


7,
如此,在另外的for循环里,还需要去用 !L!,!J! 吗?只用普通变量就够用了吧?
上一个for循环里出现了的延迟变量 !L!,!J! ,能够沿用到下一个for循环里吗?不行的吧?


8,
要排除前几个,和最后1个而删除其它文件时,可用这个解法,那如果要排除最后2个文件呢?
这个解法还管用吗?此时,不用倒序解法,还有其它解法吗?请大神赐教。


拜谢!
作者: smatenchen    时间: 2022-8-27 20:40

回复 19# qixiaobin0715

1,
非常感谢!


2,
对于第12楼大神的解法我受益颇多,我在第29楼也对此提出了看法。


3,
此解法,对于在不知文件总数时要排除最后两个文件而删除其余文件的要求,看似办不了啊!


4,
此时,好像只能用倒序解法啊!


5,
对此,你可有巧妙解法吗?请大神赐教!
作者: qixiaobin0715    时间: 2022-8-28 08:03

本帖最后由 qixiaobin0715 于 2022-8-28 08:09 编辑

回复 30# smatenchen
不一定非要使用倒序,使用变量迭代也可以啊。前者更易理解,也较为通用,效率可能也要好点。
作者: smatenchen    时间: 2022-8-28 10:38

回复 31# qixiaobin0715

变量迭代?


1,
非常感谢!


2,
变量迭代,我还不会。


3,
请大神赐教具体代码,我想借此提高一下。


4,
拜谢!
作者: qixiaobin0715    时间: 2022-8-29 09:44

回复 32# smatenchen
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%i in ('dir /b /a-d *.txt') do (
  4.     set "n0=!n1!"
  5.     set "n1=!n2!"
  6.     set "n2=%%i"
  7.     del "!n0!"
  8. )
复制代码

作者: Batcher    时间: 2022-8-29 09:58

回复 33# qixiaobin0715


加个if判断
  1. @echo off
  2. cd /d "%~dp0"
  3. setlocal enabledelayedexpansion
  4. for /f "delims=" %%i in ('dir /b /a-d *.txt') do (
  5.     set "f0=!f1!"
  6.     set "f1=!f2!"
  7.     set "f2=%%i"
  8.     if exist "!f0!" (
  9.         del /f /q "!f0!"
  10.     )
  11. )
复制代码

作者: qixiaobin0715    时间: 2022-8-29 10:02

回复 34# Batcher
对。代码运行时就不会有错误提示。
del /f /q "!f0!" 2>nul
也行!
作者: smatenchen    时间: 2022-8-29 16:06

回复 28# hfxiang

1,
非常感谢!


2,
大神的代码很有效,精简,实用!
作者: smatenchen    时间: 2022-8-29 16:18

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

回复 33# qixiaobin0715

回复 34# Batcher

回复 12# smss

回复 29# smatenchen

回复 28# hfxiang

{
@echo off
setlocal enabledelayedexpansion
for /f "delims=" %%i in ('dir /b /a-d *.txt') do (
    set "n0=!n1!"
    set "n1=!n2!"
    set "n2=%%i"
    del "!n0!"
)
}


1,
非常感谢!


2,
我没看懂其中的逻辑哦!请帮忙细说一下哦!


3,
dir /b /a-d *.txt
列出当前目录下所有txt文件,形成一个清单,在for循环里依次把值交给%%i。
这条代码是把名为xxx.txt的文件夹,都给排除了。后面的del删不动文件夹,
但会占用一次计数,一次循环。这可算是极严谨的做法了。


4,
第1次循环,
n0=!n1!,此时!n1!为空,n0就也为空。
n1=!n2!,此时!n2!为空,n1就也为空。
n2=%%i,此时%%i为1.txt,n2就也为1.txt。
del "!n0!",即删了一个空值。


5,
第2次循环,
n0=!n1!,此时!n1!为空,n0就也为空。
n1=!n2!,此时!n2!为1.txt,n1就也为1.txt。
n2=%%i,此时%%i为2.txt,n2就也为2.txt。
del "!n0!",即删了一个空值。


6,
第3次循环,
n0=!n1!,此时!n1!为1.txt,n0就也为1.txt。
n1=!n2!,此时!n2!为2.txt,n1就也为2.txt。
n2=%%i,此时%%i为3.txt,n2就也为3.txt。
del "!n0!",即删了1.txt。


7,
第4次循环,
del "!n0!",即删了2.txt。


8,
第100次循环,
del "!n0!",即删了98.txt。


9,
牛啊!没想到巧妙在这里啊!谁发明的呢?


10,
依此思路,要排除前面2个而删除其余文件时,也可以用这个解法吗?
现在是用了正向迭代解法,那有没有反向迭代解法的应用例子呢?
似乎不用到第12楼里的或跳行解法,看似不行啊?


11,
依此思路,要排除前面2个和后面2个而删除其余文件时,似乎不加入第12楼里的或跳行解法,
只用正向迭代解法,看似也不行啊?


12,
如果,不知文件总数,要排除前面第1,3,5个和后面倒数第1,3,5个而删除其余文件时,
这又要如何写解法代码呢?我头都大了啊!哈哈!


13,
{
@Echo off&SetLocal EnableDelayedExpansion&set n=0
for /r %%i in (*)do (

if not "%%~nxi"=="%~nx0" (set /a n+=1

if "!n!"=="1" set L=%%i

set J=%%i

)
)
for /r %%i in (*)do if not "%%~nxi"=="%~nx0" if not "%%i"=="!L!" if not "%%i"=="!J!" del/s/q "%%i"

pause
}


这个第12楼里的解法,我总觉得在第2个for循环里有些古怪,可参看我在第29楼的分析。
有大神愿意逐次剖析一下这个第12楼里的解法吗?

作者: Batcher    时间: 2022-8-29 18:19

回复 37# smatenchen


在第一个for循环内部观察一下两个变量的值是如何变化的:
echo !L!
echo !J!
再想想能否明白代码的思路和实现的功能
作者: smatenchen    时间: 2022-8-29 22:36

回复 38# Batcher

回复 35# qixiaobin0715


{
@Echo off&SetLocal EnableDelayedExpansion&set n=0
for /r %%i in (*)do (

if not "%%~nxi"=="%~nx0" (set /a n+=1


if "!n!"=="1" set L=%%i


set J=%%i


)

)
for /r %%i in (*)do if not "%%~nxi"=="%~nx0" if not "%%i"=="!L!" if not "%%i"=="!J!" del/s/q "%%i"

pause
}


1,
非常感谢!


2,
在第一个for循环里echo !L!,echo !J!。
结果很显然,echo !L!只会显示第一个枚举到的文件f1。
echo !J!则会逐次将每一个枚举到的文件显示出来,f1,f2,……f100……。


3,
所以,问题不在第1个循环里,我在第29,37楼里都分析过了。


4,
疑问出在第2个循环里,第1个循环里的!J!能传递到第2个循环里吗?
用了延迟,就会逐次显示出来,而不是显示最后的那个值。


5,
但在第2个循环里,会继承!J!的每一个值吗?
若继承,那在第2个循环里,就会一个文件都不删除了。这岂不全然无用?
那第12楼里的代码,就全无意义了呀?这简直是谜之困惑呀!


6,
看样子,我就只能去实际测试第12楼里的代码了!
作者: smatenchen    时间: 2022-8-29 23:33

回复 38# Batcher

回复 35# qixiaobin0715

回复 12# smss

回复 29# smatenchen

回复 28# hfxiang

回复 37# smatenchen

回复 39# smatenchen


{
@Echo off&SetLocal EnableDelayedExpansion&set n=0
for /r %%i in (*)do (

if not "%%~nxi"=="%~nx0" (set /a n+=1


if "!n!"=="1" set L=%%i


set J=%%i


)

)
for /r %%i in (*)do if not "%%~nxi"=="%~nx0" if not "%%i"=="!L!" if not "%%i"=="!J!" del/s/q "%%i"

pause
}


1,
非常感谢!


2,
我测试了一下,果然如我在第29楼里的分析,!J!是不会传递到另一个for循环里的。
用了延迟,是要循环起来时才会逐次赋值给变量,没循环就不会逐次赋值了。
所以,在其第2个for循环里,调用!J!已无意义,与调用%J%应是一样的。


3,
这个第12楼里的解法,会去除头尾文件而删除其它文件,这结果一如所料!
其代码还是挺有启发意义的,不过解决不了要保留最后两个而删除其它文件的问题。


4,
我在这个帖子里,提出了很多问题,却没有大神来逐一解答,甚是遗憾!
这不利于技术促进,提高,其实这也是会拖大家后腿的。


5,
有大神前来揭帖,接下英雄帖吗?
作者: Batcher    时间: 2022-8-30 08:38

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

作者: smatenchen    时间: 2022-8-30 16:42

本帖最后由 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,
我在本帖里还提出了好几个其它问题,两位大神有空时请帮忙写一下解法代码啊!


拜谢!

作者: qixiaobin0715    时间: 2022-8-30 17:02

有些回帖比较随意,又与其他帖子没什么联系,觉得又没什么用处,就删除掉了,习惯而已。
作者: smatenchen    时间: 2022-8-30 18:33

回复 43# qixiaobin0715


作者: qixiaobin0715    时间: 2022-8-31 09:44

本帖最后由 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. )
复制代码
刚才不小心参数写错了,重新发一遍。
作者: smatenchen    时间: 2022-8-31 21:20

回复 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,
我猜想出反向迭代的概念,能帮我实现一下吗?试出反向迭代的应用例子来。
拜谢!
作者: qixiaobin0715    时间: 2022-9-1 10:42

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

作者: WHY    时间: 2022-9-1 13:40

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

作者: smatenchen    时间: 2022-9-1 16:54

回复 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,
我想了一下,反向迭代解法,应是不可行的,那相当于是时光倒流。这样,看来就只能是正向迭代了。
作者: smatenchen    时间: 2022-9-1 17:49

回复 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,
感谢写出了这么多的解法,又再次拓宽,丰富了我的解法思路了。


多谢!
作者: qixiaobin0715    时间: 2022-9-2 10:27

繁琐吗?我倒觉得48楼是最好的代码。“既有解法的影响”?没看出来。
作者: smatenchen    时间: 2022-9-2 21:33

回复 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去判断,实在是有点繁琐,我猜是可以再巧妙一点的。


作者: qixiaobin0715    时间: 2022-9-3 11:03

112233...,挥毫指点江山。不要总是猜嘛,把你猜的想法总结为简洁代码,贴出来让大家学习学习。
作者: smatenchen    时间: 2022-9-3 23:07

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

回复 53# qixiaobin0715

回复 34# Batcher

回复 12# smss

回复 28# hfxiang

回复 48# WHY

1,
哈哈哈!


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


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


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


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





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