标题: [已结]如何删除小于某K的文件?
[打印本页]
作者: austion
时间: 2008-11-24 09:04
标题: [已结]如何删除小于某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 ]
作者: austion
时间: 2008-11-24 10:13
找到一个了,不过可惜如果把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
作者: tireless
时间: 2008-11-24 10:17
你的代码我的理解是:
你想查找根目录下存在
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 ]
作者: austion
时间: 2008-11-24 10:30
我当时的想法是使用dir 按小到大排序,这样到了TW.EXE这份文件的时候不就是一个间接的比较大小了。也就是说都删除了小于TW.EXE文件。
不过可惜还是运行不了。
还有为什么
dir/s/b/d
set size=%%~zi
一旦把dir里的/s去掉%%~zi就不能用了?
作者: austion
时间: 2008-11-24 11:01
现在在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 的大小是 字节
和:
' 的大小是 字节
' 的大小是 字节
呢?是我的代码那部分出错了?
作者: tireless
时间: 2008-11-24 11:44
标题: 删除 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
作者: tireless
时间: 2008-11-24 11:49
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 ]
作者: austion
时间: 2008-11-24 13:37
其实这个本来是想在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 ]
作者: HAT
时间: 2008-11-24 16:20
标题: Re 8楼
DOS没有这样的变量扩展:
set size=%%~zi
作者: austion
时间: 2008-11-24 23:11
根据一楼自己做的接着做了个下面的:
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 ]
作者: terse
时间: 2008-11-24 23:56
dos 里 for 不支持 /f 参数
作者: austion
时间: 2008-11-25 09:18
这个
dos 里 for 不支持 /f 参数
使我技穷了,那么各位有什么办法可行的呢?
作者: DOSforever
时间: 2008-11-25 18:49
参考一下这里:
http://www.cn-dos.net/forum/viewthread.php?tid=44071
作者: austion
时间: 2008-11-25 19:47
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 行就可以了。
但是我有个显示的问题。
作者: alchemist
时间: 2008-11-27 17:24
用locate软件解决。