[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
回复 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,
有大神前来揭帖,接下英雄帖吗?

TOP

回复 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楼里的代码了!

TOP

回复 37# smatenchen


在第一个for循环内部观察一下两个变量的值是如何变化的:
echo !L!
echo !J!
再想想能否明白代码的思路和实现的功能
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

本帖最后由 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楼里的解法吗?

TOP

回复 28# hfxiang

1,
非常感谢!


2,
大神的代码很有效,精简,实用!

TOP

回复 34# Batcher
对。代码运行时就不会有错误提示。
del /f /q "!f0!" 2>nul
也行!

TOP

回复 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. )
复制代码
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

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

TOP

回复 31# qixiaobin0715

变量迭代?


1,
非常感谢!


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


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


4,
拜谢!

TOP

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

回复 30# smatenchen
不一定非要使用倒序,使用变量迭代也可以啊。前者更易理解,也较为通用,效率可能也要好点。

TOP

回复 19# qixiaobin0715

1,
非常感谢!


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


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


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


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

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

本帖最后由 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

{
@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

回复 19# qixiaobin0715



1
感谢大神!


2
有效,可行!

TOP

返回列表