Board logo

标题: [文件操作] 批处理如何删除大小为0KB的文件? [打印本页]

作者: CGQNET    时间: 2016-4-6 11:27     标题: 批处理如何删除大小为0KB的文件?

在批处理中,如何删除大小为0KB的文件?求各位大侠了。
作者: happy886rr    时间: 2016-4-6 11:34

本帖最后由 happy886rr 于 2016-4-6 13:02 编辑

回复 1# CGQNET
  1. @echo off&for /f "delims=" %%a in ('dir /a-d /b /s') do (if %%~za equ 0 del /f /q "%%a")
复制代码

作者: CrLf    时间: 2016-4-6 12:31

  1. hash /z::~0 /do:"del ""%%s"""
复制代码
第三方工具 HASH 下载:http://www.bathome.net/s/tool/?key=hash&keymode=4
3.0 以上版本才支持 /do 开关
作者: happy886rr    时间: 2016-4-6 14:01

回复 3# CrLf
大师,我发现批处理可以和C语言混编。利用tcc的-run参数,无需编译成exe直接就能运行,类似C脚本。
  1. /*
  2. @echo off&pushd "%~dp0tcc"&cls
  3. ren %0 "%~n0.c"&tcc.exe -run "%~dp0%~n0.c"&ren "%~dp0%~n0.c" "%~nx0"
  4. pause>nul
  5. exit
  6. */
  7. #include <stdio.h>
  8. main()
  9. {
  10. printf("It woeks!");
  11. return 0;
  12. }
复制代码

作者: CrLf    时间: 2016-4-6 18:35

回复 4# happy886rr


   
作者: pcl_test    时间: 2016-4-6 20:36

回复 4# happy886rr


    这种注释屏蔽法只要其他语言的代码解释器支持命令行模式且其注释与批处理的不冲突,基本上都可以跟批处理混编的
作者: pcl_test    时间: 2016-4-6 21:02

  1. forfiles /m *.* /c "cmd /c if @fsize==0 del @file"
复制代码

作者: happy886rr    时间: 2016-4-6 22:05

回复 6# pcl_test
这个主要是模拟不编译C文件,就运行,居然也成功,可能是tcc在内存里编译了吧。这样实际效果等同于脚本语言,只是tcc库少了许多,毕竟体积才200k多。
作者: CGQNET    时间: 2016-4-20 10:10

谢谢诸位大侠!
作者: CGQNET    时间: 2016-4-23 14:27

回复 2# happy886rr

此法可能还不够完美,我尝试建立几个空的.txt文件(文件属性显示是0KB),一个改名为.ppt,另一个改名为.doc。执行代码:
    @echo off
    FOR /f "delims="  %%a IN ('dir *.ppt /s /a /b')  DO (if %%~za equ 0 DEL /f /s /q "%%a")
   FOR /f "delims="  %%b IN ('dir *.doc /s /a /b' ) DO (if %%~za equ 0 DEL /f /s /q "%%b")
   pause

结果看到,第一行执行正常(能删),但第二语句不能执行,找不到原因,求大侠了!
作者: CGQNET    时间: 2016-4-23 14:30

回复 3# CrLf

hash 是好东西,但它只能删除当前目录的0KB文件,深层文件夹的0KB文件就不行了。
作者: CrLf    时间: 2016-4-23 18:04

回复 11# CGQNET


    加 /s 开关即可
作者: 再世情緣    时间: 2016-4-23 21:29

本帖最后由 再世情緣 于 2016-4-23 21:30 编辑

回复 10# CGQNET


    你那第二行有个变量名错了

FOR /f "delims="  %%b IN ('dir *.doc /s /a /b' ) DO (if %%~za equ 0 DEL /f /s /q "%%b")

应该是
  1. FOR /f "delims="  %%b IN ('dir *.doc /s /a /b' ) DO (if %%~zb equ 0 DEL /f /s /q "%%b")
复制代码
或者你可以写在一起
  1. FOR /f "delims="  %%a IN ('dir *.doc *.txt /s /a /b 2^>nul' ) DO (if %%~za equ 0 DEL /f /s /q "%%~fa")
复制代码

作者: CGQNET    时间: 2016-4-24 13:20

问题已经解决,谢谢!
作者: CGQNET    时间: 2016-4-24 13:24

回复 12# CrLf

我已加了开关,如下

hash /z::~0 /do:"del ""%%s"" /s"
   
好像不行,请赐教,谢谢!
作者: CrLf    时间: 2016-4-24 15:01

回复 15# CGQNET


    卧槽!敢这么写也是心够大…
  1. hash /s /z::~0 /do:"echo del ""%%s"""
  2. pause
复制代码
危险操作,请确认无误后把 echo 去掉再执行
作者: codegay    时间: 2016-4-24 17:13

回复 16# CrLf


    哈哈,应该先备份一下再操作。
前几天我信心爆棚地删删删删删删删删。。也不知道删了啥东西,现在系统死了几天现在也没能恢复过来。
作者: Nsqs    时间: 2016-4-24 17:22

本帖最后由 Nsqs 于 2016-4-24 17:25 编辑

关于0kb删除
  1. @echo off&setlocal enabledelayedexpansion
  2. :return
  3. set/a n=-1,p=-1,cc=0
  4. for /f "delims=" %%1 in ('dir/s/b/a-d')do (
  5. if %%~z1 equ 0 (
  6. set/a p+=1
  7. set f!p!=%%1
  8. set s!p!=%%~nx1
  9. if !n! lss 9 set /a n+=1&call echo [!n!]%%~nx1
  10. ))
  11. set c=-1
  12. :select
  13.         echo 输入u表示上一页;l表示下一页;
  14. set /p input=输入要删除的编号(A表示全部删除;[0-9]表示删除第n项;s表示删除10个):
  15. if /i "%input%"=="s" call:_N
  16. if /i "%input%"=="a" call:_all
  17. if /i "%input%"=="u" set/a cc-=1, c=cc*10&call:_U
  18. if /i "%input%"=="l" set/a cc+=1, c=cc*10&call:_L
  19. if /i "%input%"=="q" exit
  20. echo %input%|findstr "[0-9]" >nul 2>nul
  21. if %errorlevel%==0 set /a c=cc*10,ss=-1&call:_del
  22. goto select
  23. :_all
  24. cls&(for /l %%1 in (0 1 %p%)do set "s%%1="&del !f%%1!&set "f%%1=")2>nul&goto :eof
  25. :_U
  26. cls&if %c% lss 0 set/a c=0,cc=0
  27. for /l %%1 in (0 1 9)do (set/a z=c+%%1
  28. call set x$=%%s!z!%%
  29. if not !x$!#==# echo [%%1]!x$!)
  30. goto :eof
  31. :_L
  32. cls&if %c% gtr %p% set/a c=c-10,cc-=1
  33. for /l %%1 in (0 1 9)do (
  34. set/a z=c+%%1
  35. call set x$=%%s!z!%%
  36. if not !x$!#==# echo [%%1]!x$!
  37. )
  38. goto :eof
  39. :_del
  40. cls&set/a ss+=1,r=0&set x$=!input:~%ss%,1!
  41. if not !x$!#==# (
  42. set/a r=c+!x$!
  43. call del %%f!r!%%
  44. goto _del
  45. )
  46. call:return
  47. goto :eof
  48. :_N
  49. cls&for /l %%1 in (0 1 10)do (
  50. set/a z=c+%%1
  51. call set x$=%%f!z!%%
  52. if not !x$!#==# del !x$!
  53. )
  54. call:return
  55. goto :eof
复制代码

作者: CrLf    时间: 2016-4-24 19:22

回复 17# codegay


    绝不告诉你我小时候在别人电脑上玩游戏,嫌文件太多找着麻烦,于是把除了 exe 以外的所有文件都删掉
作者: happy886rr    时间: 2016-4-24 19:51

本帖最后由 happy886rr 于 2016-4-24 19:52 编辑

回复 17# codegay
用wimboot,或者差分vhd,系统文件都是指针,或者用RAM系统。
作者: codegay    时间: 2016-4-24 21:12

回复 20# happy886rr


    好的,感谢。以前都没听说过。以后再找时间来玩。
作者: happy886rr    时间: 2016-4-24 21:25

回复 21# codegay
可以把指针索引释放到内存条里,这样系统的原始文件在ssd上,索引在内存里,可以有接近内存的响应速度。我以前把win7系统全部跑在内存里,连硬盘,ssd都不需要,只需要个大内存条。




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