中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [已结]如何删除小于某K的文件?
作者:
标题: [已结]如何删除小于某K的文件? 上一主题 | 下一主题
austion
初级用户





积分 178
发帖 82
注册 2006-5-12
状态 离线
『楼 主』:  [已结]如何删除小于某K的文件?

首先说明目的,我打算把在盘符下所有小于一定大小的exe文件都删除掉,当然除了启动盘外。

同时也想请教一下我的下面代码哪里出错了。


下面是我的一个失败的,我现在也只是想到这些了。可惜运行不了。
说明tw.exe是一份227K的文件。当中以防误删所以建立了一个99的文件夹。
for %%c in (w v u t s r q p o n m l k j i h g f e d c) do if not exist %%c:\boot.ini (
set twexe=%%c
set test=0
copy tw.exe %twexe%:\99\tw.exe
if exist %twexe%:\99\tw.exe ( for /f "delims=" %%a in ('dir %twexe%:\99\*.exe /a /b /os > 234.txt') do ( if "%test%" neq "1" (
type 234.txt |find /i "tw.exe" >nul
if errorlevel 1 (del %twexe%:\99\%%a ) else (set test=1 )

)
)
)
)
[ Last edited by HAT on 2008-11-25 at 23:18 ]

2008-11-24 09:04
查看资料  发短消息 网志   编辑帖子  回复  引用回复
austion
初级用户





积分 178
发帖 82
注册 2006-5-12
状态 离线
『第 2 楼』:  

找到一个了,不过可惜如果把DIR/S/B/D改成dir/b/d就不能判断文件大小了,我想要的单单是在盘符下,盘符下的目录里的文件不检查。

clian76
中级用户

if exist d:\查找结果.txt del/q/f d:\查找结果.txt
::FOR里 F:\test\*.lst 换成想查找的文件类型和路径
For /f "delims=" %%i In ('dir/s/b/d F:\test\*.lst') do (
    set fpath=%%i
    set size=%%~zi
    call :2
)
start notepad.exe d:\查找结果.txt
exit

:2
if 1000000 LEQ %size% if %size% LEQ 2000000 (
echo.>>d:\查找结果.txt
echo 文件: [ %fpath% ]>>d:\查找结果.txt
echo 大小: [ %size% 字节 ]>>d:\查找结果.txt
find /i "这里换成你想查找的字符串" "%fpath%">>d:\查找结果.txt
goto :eof)
这里你至少改两处地方,
1、For /f "delims=" %%i In ('dir/s/b/d F:\test\*.lst') do (
上面这句红色标示的路径改成你想查找的路径和文件顾类型
2、find /i "这里换成你想查找的字符串" "%fpath%">>d:\查找结果.txt
这里红色标示改成你想查找的文字内容。
我测试通过 CMD@XP

2008-11-24 10:13
查看资料  发短消息 网志   编辑帖子  回复  引用回复
tireless
银牌会员





积分 2025
发帖 1122
注册 2007-9-5
状态 离线
『第 3 楼』:  

你的代码我的理解是:

你想查找根目录下存在 99 这个文件夹,而不存在 boot.ini 文件的盘符。然后复制 tw.exe 到这个盘符的 99 文件夹中,如复制成功的话,把 99 文件夹中的 .exe 文件列表输出到 234.txt但是,这时你又在 234.txt 中寻找 tw.exe,这我就不懂了,前面已经判断复制已成功,难道还会不存在 tw.exe至于代码中出现的 test 变量,我感觉你的意思是执行过一次后就不再执行了,如果是这样的话可以在后面跳出 for 循环。

这里面好像没有查找文件大小的代码吧。

代码中的错误:

  Quote:
set twexe=%%c
set test=0
copy tw.exe %twexe%:\99\tw.exe

纠正:%twexe% 应该为 !twexe!,前面加上 setlocal EnableDelayedExpansion

[ Last edited by tireless on 2008-11-24 at 10:32 ]

2008-11-24 10:17
查看资料  发短消息 网志   编辑帖子  回复  引用回复
austion
初级用户





积分 178
发帖 82
注册 2006-5-12
状态 离线
『第 4 楼』:  

我当时的想法是使用dir 按小到大排序,这样到了TW.EXE这份文件的时候不就是一个间接的比较大小了。也就是说都删除了小于TW.EXE文件。
不过可惜还是运行不了。

还有为什么
dir/s/b/d
  set size=%%~zi
一旦把dir里的/s去掉%%~zi就不能用了?

   此帖被 +1 点积分    点击查看详情   
评分人:【 tireless 分数: +1  时间:2008-11-24 11:23


2008-11-24 10:30
查看资料  发短消息 网志   编辑帖子  回复  引用回复
austion
初级用户





积分 178
发帖 82
注册 2006-5-12
状态 离线
『第 5 楼』:  

现在在WIN下算是成功了。
代码如下:
@echo off

for %%i in (' dir/b D:\test\01\*.* ') do (
    set fpath=%%i
    set size=%%~zi
    call :2
)

:2
if 10 LEQ %size% if %size% LEQ 100000 (
echo %fpath% 的大小是 %size% 字节 >> d:\789.txt
del %fpath%
goto :eof)

这个代码删除大于10字节小与100K的文件。
但是我现在有一个问题,由于上面的在
:2里的echo %fpath% 的大小是 %size% 字节 >> d:\789.txt 是作为测试用的,不过问题出现了在那份789.txt文件里的内容显示的是:


' 的大小是  字节  
dir/b 的大小是  字节  
D:\test\01\boot.ini 的大小是 247 字节  
D:\test\01\boot00.ini 的大小是 215 字节  
D:\test\01\delauto.bat 的大小是 380 字节  
D:\test\01\delauto00.bat 的大小是 404 字节  
D:\test\01\test.txt 的大小是 2758 字节  
D:\test\01\try01.bat 的大小是 252 字节  
' 的大小是  字节  
' 的大小是  字节  


上面的显示为什么会出现:
' 的大小是  字节  
dir/b 的大小是  字节  

和:
' 的大小是  字节  
' 的大小是  字节  

呢?是我的代码那部分出错了?

2008-11-24 11:01
查看资料  发短消息 网志   编辑帖子  回复  引用回复
tireless
银牌会员





积分 2025
发帖 1122
注册 2007-9-5
状态 离线
『第 6 楼』:  删除 g:\99\ 下小于200KB的 .exe 后缀文件:


@echo off
cd /d g:\99\
for /f "delims=" %%a in ('dir /a:-d /b /o:s *.exe') do (
  if %%~za gtr 204800 goto out
  echo del "%%a"
)
:out
pause


2008-11-24 11:44
查看资料  发短消息 网志   编辑帖子  回复  引用回复
tireless
银牌会员





积分 2025
发帖 1122
注册 2007-9-5
状态 离线
『第 7 楼』:  



  Quote:
还有为什么
dir/s/b/d
  set size=%%~zi
一旦把dir里的/s去掉%%~zi就不能用了?

需要完整路径或在当前目录。如以下不会成功:
C:\>for /f %a in ('dir /b g:\test\*.exe') do @echo %~a (size:%~za)
exelist.exe (size:)
getlnk.exe (size:)
gifsicle.exe (size:)
IconInjector.exe (size:)
pathman.exe (size:)

改成以下两种可行:

① 进入该目录:
C:\>cd /d g:\test\

G:\test>for /f %a in ('dir /b *.exe') do @echo %~a (size:%~za)
exelist.exe (size:10752)
getlnk.exe (size:45056)
gifsicle.exe (size:156672)
IconInjector.exe (size:334848)
pathman.exe (size:6656)

② 使用完整路径:
C:\>for %a in (g:\test\*.exe) do @echo %~a (size:%~za)
g:\test\exelist.exe (size:10752)
g:\test\getlnk.exe (size:45056)
g:\test\gifsicle.exe (size:156672)
g:\test\IconInjector.exe (size:334848)
g:\test\pathman.exe (size:6656)


[ Last edited by tireless on 2008-11-24 at 11:59 ]

2008-11-24 11:49
查看资料  发短消息 网志   编辑帖子  回复  引用回复
austion
初级用户





积分 178
发帖 82
注册 2006-5-12
状态 离线
『第 8 楼』:  

其实这个本来是想在DOS下删除auto病毒的。
目的是在使用DOS启动进入GHOST前,也就是现在很多的那些什么什么GHOST的东西,在他们启动前调用一个批处理来删除auto*.inf文件以及其他在盘符下小于200K的.exe和.com文件。由于病毒一般都不大,而且还是直接在盘符下的可执行文件就有问题了。


for %%g in (c d e f g h) do if not exist %%g:\boot.ini (
for %%h in (' dir/b %%g:\*.exe %%g:\*.com ') do (
    set fpath=%%h
    set size=%%~zi
    call :2
)
)


goto exit


:2
if 10 LEQ %size% if %size% LEQ 200000 (
del %fpath%
)
:exit

上面的代码在xp下是可用,但是在dos 却不可用,说命令错误。

[ Last edited by austion on 2008-11-24 at 16:13 ]

2008-11-24 13:37
查看资料  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 9 楼』:  Re 8楼

DOS没有这样的变量扩展:
set size=%%~zi



2008-11-24 16:20
查看资料  发短消息 网志   编辑帖子  回复  引用回复
austion
初级用户





积分 178
发帖 82
注册 2006-5-12
状态 离线
『第 10 楼』:  

根据一楼自己做的接着做了个下面的:

set panf0=c
if not exist c:\boot.ini call :than

set panf0=d
if not exist d:\boot.ini call :than

set panf0=e
if not exist e:\boot.ini call :than

goto exit

:than
for /f "delims=" %%i in ( ' dir /a /b /os %panf0%:\*.exe %panf0%:\*.com ' ) do (
echo %%i > d:\234.txt
type d:\234.txt |find /i "TW.EXE" >nul
if errorlevel 1 (echo %%i >>%panf0%:\123.txt ) else ( echo %%i >> d:\2345.txt
goto :eof )
)
goto :eof

:exit

在XP下正常,但是一到了DOS就不行了,希望大家帮忙查错
如果把上面的
set panf0=c
if not exist c:\boot.ini call :than

改为
set panf0=c
if exist c:\boot.ini call :than

那么将会出现在C盘下的123.txt显示的却是在C:\WINDOWS目录下的EXE和COM文件。其他的TXT都是出错的。如果按照上面的代码的话,那么一个TXT都没有。

上面的代码哪些错了,如何的修改?

[ Last edited by austion on 2008-11-24 at 23:12 ]

2008-11-24 23:11
查看资料  发短消息 网志   编辑帖子  回复  引用回复
terse
银牌会员





积分 2404
发帖 946
注册 2005-9-8
状态 离线
『第 11 楼』:  

dos 里 for 不支持  /f 参数



简单!简单!再简单!
2008-11-24 23:56
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
austion
初级用户





积分 178
发帖 82
注册 2006-5-12
状态 离线
『第 12 楼』:  

这个
dos 里 for 不支持  /f 参数
使我技穷了,那么各位有什么办法可行的呢?

2008-11-25 09:18
查看资料  发短消息 网志   编辑帖子  回复  引用回复
DOSforever
金牌会员





积分 4639
发帖 2239
注册 2005-1-30
状态 离线
『第 13 楼』:  

参考一下这里:

http://www.cn-dos.net/forum/viewthread.php?tid=44071

   此帖被 +2 点积分    点击查看详情   
评分人:【 HAT 分数: +2  时间:2008-11-25 23:18




DOS倒下了,但永远不死
DOS NEVER DIES !

投票调查:
http://www.cn-dos.net/forum/viewthread.php?tid=46187

本人尚未解决的疑难问题:
http://www.cn-dos.net/forum/viewthread.php?tid=15135
http://www.cn-dos.net/forum/viewthread.php?tid=47663
http://www.cn-dos.net/forum/viewthread.php?tid=48747
2008-11-25 18:49
查看资料  发短消息 网志   编辑帖子  回复  引用回复
austion
初级用户





积分 178
发帖 82
注册 2006-5-12
状态 离线
『第 14 楼』:  



  Quote:
Originally posted by DOSforever at 2008-11-25 18:49:
参考一下这里:

[url]先来说一下如何指定文件大小的范围,这是一个参数,不是某个具体的命令,而且这个参数差不多可以在许多操作对象是文件为参数的 4DOS 命令中使用,例如,指定大小在1~2M之间的文件,如果这里的 1M=1048576byte ,那么可以用 [s1M,2M] ;如果这里的 1M=1,000,000byte ,那么可以用 [s1m,2m];同样,k 和 K 的区别也是如此;你也可以指定具体字节数,比如 [s1024,2048] 。
具体到某个命令,比如查找文件大小为1M~2M之间的文件,可以
dir /[s1M,2M]
dir /[s1M,2M] *.txt

那么如何搜索字符串呢?是 FFIND 命令,搜索含有字符串"good"的文件,同时限定搜索文件的大小在1~2M之间可以这样用:
ffind /[s1M,2M] /t"good" *.*

[/url]

谢谢了,使用4DOS 行就可以了。
但是我有个显示的问题。

2008-11-25 19:47
查看资料  发短消息 网志   编辑帖子  回复  引用回复
alchemist
高级用户




积分 652
发帖 193
注册 2005-9-25
状态 离线
『第 15 楼』:  

用locate软件解决。



ディスケット  オペレーティン  グシステム
2008-11-27 17:24
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: