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

常规思路:
  1. @echo off
  2. for /f "delims=" %%a in ('dir /s /b /a-d *.*') do (
  3.    if defined %%~nxa (
  4.       del "%%a"
  5.    ) else set "%%~nxa=."
  6. )
复制代码
另类思路,高效简明:
  1. @echo off
  2. for /r %%a in (*.*) do (
  3.    del /f /s "%%~nxa" 3>>"%%a"
  4. ) 2>nul
  5. ::嘿嘿,句柄,你懂得
  6. pause
复制代码

TOP

刚才漏了一对双引号,已修改

TOP

本帖最后由 zm900612 于 2011-5-24 15:17 编辑

6# regabc


大概是因为方法二的测试参数忘了去掉,已经改好
好吧,方法一确实也错了...漏了/b

TOP

9# plp626


不会误删,因为if的条件语句是和语块一起划分的,证据是它和for一样不接受变量延迟参数,若在条件语句中用变量延迟或%%a来试图切换是否使用not,那是一定会出错的。所以划分if defined的时候%%a尚未被解释,也就不存在空格的问题

TOP

而另类思路,其实我最初是打算用文件属性来筛选,但是忽然想起来当一个文件被正在试图写入的句柄占用时,除了这个句柄能够进行写入操作以外,它是只读的。所以我用一个空句柄对要保留的文件进行附加操作,这样一来,这个文件对del来说是正被占用而无法删除的,但是别的同名文件却能被成功删除,也就达到了删除重复文件的效果。一个创新,没想到竟然连plp都看不懂…看来有可能是首创了,我好高兴啊

TOP

12# plp626


等号的问题确实要命,以前没想过,但是文件名含空格的情况却不会影响if defined,原因已经在前面说了的。if是一个特殊的语块,不能用像看待普通语句一样去判断它的预处理流程。最后,邀请plp兄合个影,以作千贴留念,同意请说茄子…

TOP

两个方法均已测试,如果还是不行,那我无能为力

TOP

本帖最后由 zm900612 于 2011-5-25 16:44 编辑

14# plp626

通用的也不难嘛,等号我是没办法,别的倒好办
  1. @echo off
  2. for /f "delims=" %%a in ('dir /s /b /a-d *.*') do (
  3.    if defined %%~nxztaa (
  4.       del "%%a"
  5.    ) else set "%%~nxztaa=."
  6. )
复制代码

TOP

22# plp626


忘了%%~sa是带路径的了,看来还是得用%%~nxa

TOP

返回列表