找回密码
 加入
搜索
查看: 1830|回复: 8

好久没提问了,如何做到排除目录删除文件

[复制链接]
发表于 2009-4-14 22:34:08 | 显示全部楼层 |阅读模式
本帖最后由 116154801 于 2009-4-28 22:49 编辑

好久没提问了,最近病毒猖狂,我这里的网吧遇到的问题是  E盘里面有个XXX目录,里面有个病毒,只能读,没本法删除.
本人已经利用了高人的  cacls.exe E:\b30829936fa182a179404e04\* /e /t /g everyone:F   命令让 E:\b30829936fa182a179404e04\ 这个目录改成安全完全控制,然后删除。。
可是 ,每台机的这个病毒目录名都不一样。想研究使用排除目录,其他文件目录都执行这个文件,然后删除掉,这样就高枕无忧了。。呵呵 ,请各位大哥大姐帮帮忙啦、谢谢啦、、
“A目录,B目录,C目录,”排除,遇到的其他目录都执行用户完全控制,然后删除。

目录=E:\
排除=A目录,B目录,C目录,

[ 本帖最后由 116154801 于 2009-4-14 22:36 编辑 ]
发表于 2009-4-14 22:46:14 | 显示全部楼层

这样看行不行,好像麻烦了点

先把E盘改成everyone都有所有权限,然后在改A、B、C目录为没有权限,然后删除E盘中所有的的文件夹。再把A、B、C目录权限还原。好像麻烦了点
 楼主| 发表于 2009-4-14 22:54:44 | 显示全部楼层
是很麻烦啊。再说了,是网吧呢。
 楼主| 发表于 2009-4-14 23:18:11 | 显示全部楼层
这里有个高人写的,可是太复杂了,各位能简化点吗?

#NoTrayIcon ;;;你是好样的。
dim $log
$g_szVersion = "Diskclr V1.01-beta by luren"    ;;;本段防止重复打开
If WinExists($g_szVersion) Then Exit
AutoItWinSetTitle($g_szVersion)
$begintime = TimerInit()

for $x = 1 to 99
$segment = "config" & $x

$excComputerName = iniread(@ScriptDir & "\diskclr.ini",$segment,"排除机器","")
if $excComputerName = "allcomputer" then
   ContinueLoop
Else
$spexcComputerName = stringsplit($excComputerName,"|")
$skip = False
for $n = 1 to UBound($spexcComputerName) - 1
   if @ComputerName = $spexcComputerName[$n] then
    $skip = True
    ExitLoop
   EndIf
Next
if $skip then
   ContinueLoop
EndIf
EndIf

$clrdir = IniRead(@ScriptDir & "\diskclr.ini",$segment,"清理目录","")
If stringlen($clrdir) <> 0 then
$excdir = IniRead(@ScriptDir & "\diskclr.ini",$segment ,"排除目录","")
$excfile = IniRead(@ScriptDir & "\diskclr.ini",$segment ,"排除文件","")
$clewdel = iniread(@ScriptDir & "\diskclr.ini",$segment ,"提示删除","")
Else
continueloop
EndIf
$spexcdir = stringsplit($excdir,"|")
$spexcfile = stringsplit($excfile,"|")
$spclewdel = stringsplit($clewdel,"|")
$search = FileFindFirstFile($clrdir & "\*.*")
If $search = -1 Then ExitLoop
while 1
    $file = FileFindNextFile($search)
     If @error Then
   FileClose($search)
   ExitLoop
ElseIf stringinstr(FileGetAttrib($clrdir & "\" & $file),"D") then
   $del = False
   for $m = 1 to UBound($spclewdel) - 1      ;;;询问是否删除目录
    if $file = $spclewdel[$m] then
    $msg =   msgbox(262144 + 36 + 256 ,"请确认","是否移除目录" & $clrdir & "\" & $file,5)
    if $msg = 6 then $del = True
    EndIf
   Next
   if $del then
    $dirremove = dirremove($clrdir & "\" & $file,1)         ;;移除目录
    if $dirremove = 0 then $log = $log &   "目录:" & $clrdir & "\" & $file & @CRLF
   EndIf
   $del = True
   for $m = 1 to UBound($spexcdir) - 1      ;;;排除目录
    if $file = $spexcdir[$m] then
     $del = False
    EndIf
   Next
   if $del then
    $dirremove = dirremove($clrdir & "\" & $file,1)           ;;移除目录
    if $dirremove = 0 then $log =   $log & "目录:" & $clrdir & "\" & $file & @CRLF
   EndIf
Else
   $del = False
   for $m = 1 to UBound($spclewdel) - 1    ;;;询问是否删除文件
    if $file = $spclewdel[$m] then
     $msg =   msgbox(262144 + 36 + 256 ,"请确认","是否删除文件" & $clrdir & "\" & $file,5)
     if $msg = 6 then $del = True
    EndIf
   Next
   if $del then
    if stringinstr(FileGetAttrib($clrdir & "\" & $file),"R")   Then
     FileSetAttrib($clrdir & "\" & $file,"-R")
     $filedel = filedelete($clrdir & "\" & $file)           ;;移除只读文件
     FileSetAttrib($clrdir & "\" & $file,"+R")
    Else
     $filedel = filedelete($clrdir & "\" & $file)           ;;移除文件
    EndIf
    if $filedel = 0 then $log = $log &   "文件:" & $clrdir & "\" & $file & @CRLF
   EndIf

   $del = True
   for $m = 1 to UBound($spexcfile) - 1     ;;排除文件
    if $file = $spexcfile[$m] then
     $del = False
    EndIf
   Next
  
   if $del then
    if stringinstr(FileGetAttrib($clrdir & "\" & $file),"R")   Then
     FileSetAttrib($clrdir & "\" & $file,"-R")
     $filedel = filedelete($clrdir & "\" & $file)           ;;移除只读文件
     FileSetAttrib($clrdir & "\" & $file,"+R")
    Else
     $filedel = filedelete($clrdir & "\" & $file)           ;;移除文件
    EndIf
    if $filedel = 0 then $log = $log &   "文件:" & $clrdir & "\" & $file & @CRLF
   EndIf

EndIf
WEnd
Next

if iniread(@ScriptDir & "\diskclr.ini","config1","显示日志","") = 1 Then
if   stringlen($log) <> 0 Then
   msgbox(4096,"日志","下列文件删除失败,请确定此文件存在且对文件具有删除权限." & @CRLF & $log & @crlf & "共耗时" & TimerDiff($begintime)/1000 & "秒")
Else
   MsgBox(4096,"日志","清理磁盘成功!" & @crlf & "共耗时" & TimerDiff($begintime)/1000 & "秒")
EndIf
EndIf



配置格式文件如下:diskclr.ini

配置文件举例:

[config1]
清理目录=d:\netgame
排除目录=华夏online|QQR2|QQ幻想|QQ堂|傲世|霸王大陆|传奇世界|大话西游|街头篮球|劲乐团
排除文件=config.ini|profile.exe|diskclr.ini
提示删除=华夏online|diskclr.ini
排除机器=allcomputer
显示日志=1

[config2]
清理目录=
排除目录=
排除文件=
提示删除=
排除机器=allcomputer
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

注意:
1、你现在使用的是测试版本,对任何因使用本软件引起的一切后果与造成的任何法律责任,本人概不负责!
2、本软件为免费软件,您可以自由使用与传播它。但是请注意一定要保持它的原貌,不要对它进行任何修改。
3、本人保证不在软件中加入恶意或破坏的代码,但本人不保证软件完全可用性。因误操作失误或软件的BUG
    造成的问题,无任何担保.如果遇到问题可以和我联系,我会尽力帮助你解决.
4、本软件为AU3编写,某些杀毒软件可能设报为病病.
5、本软件编译时未加密,懂AU3的朋友可以自已反编译出源代码.
6、本软件具有一定的危险性,请仔细阅读本README文档,确认无误后方能运行主程序。


使用帮助:

1、[config]段最多可自定义99组,从[config1]到[config99],[config]段必须连续,
    如果有[config3],而没有[config2],则程序执行完[config1]后自动退出,
    不会再去执行[config3]中的内容,此时可在配置文件中加入一个空的[config2]段,
    下面不加"清理目录="或把"清理目录="留空不填即可.

2、"清理目录="一栏填入要清理的目录名,后面不用加"\"

3、"排除目录="一栏填入要排除的目录名,中间用"|"符号分开(不含引号)

4、"排除文件="一栏填入要排除的文件名,中间用"|"符号分开(不含引号)
     ps:用"|",现不用","或";"是因为文件名中不能出现"|"字符,防止出错.

5、"提示删除="中定义的文件或目录必须添加到“排除文件”或“排除目录”中,否则
     不管提示时回答"是"或"否",程序都会删除此目录或文件.
     出现提示后五秒内用户不选择,则默认不删除此文件或目录。

6、"排除机器="一行请填入要排除的机器的计算机名,中间用"|"符号分开(不含引号),
     不可填IP,如果留空默认为所有机器.如果为"allcomputer"则排除所有机器.
     PS:上次下载一个人写的一个类似软件,他的配置文件里面直接写的e:\,而排除文件没写,
     我下载下来,看也没看就运行了他的主程序,结果我E盘里几十G的东西没了,郁闷死我了,
     所以才想到加上"allcomputer"

7、"显示日志="为1时显示,为其它值时不显示,只需要在[config1]段中加入此行.
 楼主| 发表于 2009-4-14 23:36:22 | 显示全部楼层
刚刚在百度里面搜索了一下。这是一个高人写的
@echo off
::如果有多个路径,或者排除多个文件夹:::
::或者排除多个文件,请手工进行设置:::::
::findstr 后面可以跟多个/c:""参数::::::
::如:/c:"game" /c:"qq" /c:"net" ::::::
::中间使用空格间隔:::::::::::::::::::::
:::::::::::::::::::::::::::::::::::::::
:: ::::
::******配置文件开始*****************::
::::::::指定搜索路径::例 e:\ ::::::::::
set "dd=D:\123\"
::::::::排除文件夹:::::::::::::::::::::
set "dn=abc"
::::::::排除文件:::::::::::::::::::::::
set "fn=1.txt"
::******配置文件结束*****************::
::::::::删除文件夹:::::::::::::::::::::
for /f "delims=" %%i in ('dir /b /ad "%dd%" ^|findstr /i /v /b /e /c:"%dn%" /c:"abcd"') do attrib -s -h -r -a /s /d "%dd%%%i" && rd /s /q "%dd%%%i"

::::::::删除文件:::::::::::::::::::::::
for /f "delims=" %%i in ('dir /b /a-d "%dd%" ^|findstr /i /v /b /e /c:"%fn%" /c:"2.txt"') do del /a /f /q "%dd%%%i"
发表于 2009-4-14 23:39:24 | 显示全部楼层
以字节为单位返回指定文件的大小.
FileGetSize ( "文件名" )

这个函数返回目录字节数是0,利用这个判断是否目录,等于0跳过,否则删除???
 楼主| 发表于 2009-4-15 00:02:20 | 显示全部楼层
set "dd=E:\123\"
::::::::排除文件夹:::::::::::::::::::::
set dn=/c:"GameMenu" /c:"本地游戏" /c:"打牌聊天" /c:"工具软件" /c:"免费音乐" /c:"免费影院" /c:"网络游戏" /c:"AutoRun.inf" /c:"Desktop.ini" /c:"Folder.htt"
::::::::排除文件:::::::::::::::::::::::
set fn=/c:"1.txt"
::******配置文件结束*****************::
::::::::删除文件夹:::::::::::::::::::::
::::::::设置文件属性
for /f "delims=" %%i in ('dir /b /ad "%dd%" ^|findstr /i /v /b /e %dn%') do attrib -s -h -r -a /s /d "%dd%%%i" && rd /s /q "%dd%%%i"
::::::::设置文件安全 完全控制
for /f "delims=" %%i in ('dir /b /ad "%dd%" ^|findstr /i /v /b /e %dn%') do cacls  "%dd%%%i" /e /t /g everyone:F && rd /s /q "%dd%%%i"

::::::::删除文件:::::::::::::::::::::::
for /f "delims=" %%i in ('dir /b /a-d "%dd%" ^|findstr /i /v /b /e %fn%') do del /a /f /q "%dd%%%i"

这是我用高人写好的批命令改的,大家能帮我写 加个批量排除吗?
比如这样

[Settings]
CleanRoots=E:\
KeepDirs=GameMenu,打牌聊天,工具软件,网络游戏,免费影院,免费音乐,本地游戏,

[ 本帖最后由 116154801 于 2009-4-15 00:21 编辑 ]
发表于 2009-4-15 05:31:01 | 显示全部楼层
以前写的,删除文件可以排除项目。没有使用NTFS权限控制,有需要自己改改。

_DeleteFile("E:\*.*", "GameMenu|打牌聊天|工具软件|网络游戏|免费影院|免费音乐|本地游戏", 2)

;===============================================================================
; 说明:   删除指定文件/文件夹
; 语法:   _DeleteFile($sFile[, $sExclude = ""[, $iFlag = 0]])
; 参数:   $sFile - 需要删除的文件/文件夹, 支持通配符
;         $sExclude - [可选] 排除文件, 用|分隔多个项目
;         $iFlag - [可选] 指定删除文件还是文件夹。0 - 所有, 1 - 仅删除文件, 2 - 仅删除文件夹
; 需要:   <Array.au3> <File.au3>
; 返回:   成功 - 1
;         失败 - 0, 并设置 @error 到
;            1 - 某个文件/文件夹删除失败
;            2 - $sExclude 无效
;            3 - $iFlag 无效
; 备注:   如果目标包含文件夹, 将整个删除它。此函数类似于 DOS 命令 deltree
;===============================================================================
Func _DeleteFile($sFile, $sExclude = "", $iFlag = 0)
        Local $Path, $FileList[1], $ExcludeList[1] = [0], $FileSystem = "", $Element, $FileAttrib, $Result = 0

        If StringRight($sFile, 1) = "\" Then $sFile = StringTrimRight($sFile, 1)
        $Path = StringLeft($sFile, StringInStr($sFile, "\", 0, -1))
        $sFile = StringTrimLeft($sFile, StringInStr($sFile, "\", 0, -1))
        If $Path = "" Then $Path = @WorkingDir & "\"
        If NOT FileExists($Path) OR NOT StringInStr(FileGetAttrib($Path), "D") OR $sFile = "" Then Return 1
        If StringRegExp($sExclude, '^.*[\\/:*?"<>]+.*$') Then Return SetError(2, 0, 0)
        If $iFlag <> 0 AND $iFlag <> 1 AND $iFlag <> 2 Then Return SetError(3, 0, 0)

        $FileList = _FileListToArray($Path, $sFile, $iFlag)
        If @error Then Return 1

        If $sExclude <> "" Then $ExcludeList = StringSplit($sExclude, "|")
        $FileSystem = DriveGetFileSystem($Path)
        If $FileSystem = "NTFS" Then
                _ArrayAdd($ExcludeList, "System Volume Information")
                $ExcludeList[0] = UBound($ExcludeList) - 1
        EndIf

        For $i = 1 To $ExcludeList[0]
                $Element = _ArraySearch($FileList, $ExcludeList[$i], 1)
                If $Element <> -1 Then _ArrayDelete($FileList, $Element)
        Next
        $FileList[0] = UBound($FileList) - 1

        For $i = 1 To $FileList[0]
                If $FileList[$i] = "RECYCLER" AND $FileSystem <> "" Then
                        _DeleteFile($Path & $FileList[$i] & "\*.*")
                        If @error Then $Result = 1
                        ContinueLoop
                EndIf

                $FileAttrib = FileGetAttrib($Path & $FileList[$i])
                If StringRegExp($FileAttrib, ".*[RSH]+.*") Then FileSetAttrib($Path & $FileList[$i], "-RSH")
                If StringInStr($FileAttrib, "D") Then
                        If NOT DirRemove($Path & $FileList[$i], 1) Then
                                _DeleteFile($Path & $FileList[$i] & "\*.*")
                                $Result = 1
                        EndIf
                Else
                        If NOT FileDelete($Path & $FileList[$i]) Then $Result = 1
                EndIf
        Next

        If $Result Then
                Return SetError(1, 0, 0)
        Else
                Return 1
        EndIf
EndFunc   ;==>_DeleteFile
 楼主| 发表于 2009-4-15 11:06:52 | 显示全部楼层
谢谢这位大哥。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2025-1-12 23:01 , Processed in 0.087661 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表