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


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

如果需要上传截图,可以找个图床,例如:
http://bbs.bathome.net/thread-60985-1-1.html
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 11# smss


   1
先感谢大神出手相助。


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


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

TOP

回复 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段代码是不是等价的?

TOP

保留前面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"
复制代码

TOP

回复 17# smatenchen


%%~nxi的用法,参考for命令教程第6页:
http://bbs.bathome.net/thread-31727-1-1.html
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 20# Batcher



1
感谢坛主出手相教!
谢谢!

TOP

回复 19# qixiaobin0715


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

TOP

回复 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行,而忽略其它行吗?

TOP

回复 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
其他大神,有看懂了的吗?能帮忙解释一下吗?

TOP

回复 18# qixiaobin0715



1
感谢大神!

TOP

回复 19# qixiaobin0715



1
感谢大神!


2
有效,可行!

TOP

回复 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个文件而删除其它文件,这个方法,还有用吗?

TOP

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

TOP

回复 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个文件呢?
这个解法还管用吗?此时,不用倒序解法,还有其它解法吗?请大神赐教。


拜谢!

TOP

回复 19# qixiaobin0715

1,
非常感谢!


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


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


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


5,
对此,你可有巧妙解法吗?请大神赐教!

TOP

返回列表