Что нового

[Файловая система] Очистка профиля пользователя

CurtNN

Новичок
Сообщения
5
Репутация
0
Есть 12 компьютеров за которыми работают слушатели, после их работы нужно вычистить все с раб стола из моих документов, вот думаю можно это сделать по сети с одного компьютера? и как удалить все кроме ярлыков?
по как смог написать скрипт очистки раб стола, аналогично можно и для моих документов, как поправить чтобы удалялось все кроме ярлыков
Код:
include <file.au3>
$FileList = _FileListToArray(@DesktopDir, '*' ,0)
For $i=1 To $FileList[0]
    $FSize = FileGetSize(@DesktopDir & '\' & $FileList[$i])
    $DSize = DirGetSize(@DesktopDir & '\'  & $FileList[$i],0)
    $Nam = 1024
    If   $FSize >$Nam    Then FileDelete(@DesktopDir&'\'&$FileList[$i])
   If   $DSize >$Nam    Then DirRemove(@DesktopDir&'\'&$FileList[$i],1)
	   Next

Знаком с языком немного
 
A

Alecsis1

Гость
Привет! Мой первый пост, так что сильно не пинайте :IL_AutoIt_1:
Ну может что-то в этом роде

Код:
#include <file.au3>
Opt("MustDeclareVars", 1)

Local Const $sMsgTitle = "Очистка Рабочего стола от мусора: " & @DesktopDir, _
            $sErrList  = "Облом _FileListToArray, код ошибки = "

Local $aFileList, _     ; массив-результат  _FileListToArray
      $nErrCode, _      ; код ошибки из неё же
      $sNameToKill, _   ; что удалять (очер. имя файла/папки из массива)
      $sAttrCode, _     ; атрибут удаляемого файла/каталога
      $sCurDir, _       ; текущий каталог для восстановления после отработки скрипта
      $i


$sCurDir = @WorkingDir        ; сохранить тек. рабочий каталог
FileChangeDir(@DesktopDir)    ; перейти на раб/стол

$aFileList = _FileListToArray(@WorkingDir, '*' ,0)
$nErrCode  = @error

If $nErrCode = 0 Then
    ;
    ; _FileListToArray отработала нормально = на Раб/столе что-то есть
    ;
    For $i = 1 To $aFileList[0]

      $sNameToKill = $aFileList[$i]                     ; имя очередного кандидата на очистку
      $sAttrCode = FileGetAttrib($sNameToKill)          ; атрибуты файла/папки
      If StringInStr($sAttrCode, "D", 0) Then           ; это папка!
          ConsoleWrite("Убиваем папку " & $sNameToKill)
          DirRemove($sNameToKill, True)
          ;
          ; здесь неплохо бы проверить код ошибки от DirRemove
          ;
        Else
          ;
          ; на всякий случай убрать из $sNameToKill окаймляющие пробелы,
          ; вроде бы и необязательно, но выглядело бы более «кошерно»
          ;
          If StringRight($sNameToKill, 4) <> ".lnk" Then  ; это не ярлык, убрать его!
            ConsoleWrite("Убиваем файл " & $sNameToKill)
            FileDelete($sNameToKill)
            ;
            ; а здесь кстати возможен облом FileDelete
            ;
          EndIf
      EndIf
    Next
  Else
    MsgBox(0x30, $sMsgTitle, $sErrList & $nErrCode, 5)
EndIf

FileChangeDir($sCurDir)   ; вернуть предыдущий активный/рабочий каталог

#cs
 а если оформить весь этот изврат в отдельную ф-цию и скармливать ей
 очищаемую папку в качестве одного из аргументов, то можно чистить
 аналогичным образом хоть Мои документы, хоть что угодно :-)
 И ещё: в подпапках теоретически тоже могут быть ярлычки,
 и они при ТАКОМ раскладе прога покоцает их не моргнув глазом.
 М.б. стОит добавить проверку и на этот случай
#ce
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
CurtNN,
Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
autoit.gif
(подробнее), а обычный код соответственно в тег [code]
code.gif
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
spoiler.gif
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Модератор.
 
Автор
C

CurtNN

Новичок
Сообщения
5
Репутация
0
Новый скрипт для очистки моих документов кроме определенных папок
Вот что я написал, не работает в чем ошибка?
Код:
egion Includes
#include <Array.au3>
#include <File.au3>
#EndRegion Includes
 
Global $Yar_Data = StringSplit("3ds Max 2010 Tutorials|3dsMax|Fax|InterVideo|KMPlayer|LEGO Creations|My Meetings|STDUViewer|The KMPlayer|Отсканированные документы", "|")
$aMyDocumentsFiles = _FileListToArray(@MyDocumentsDir,0)
If Not IsArray($aMyDocumentsFiles) Then Exit 99 + 0 * MsgBox(0, "", "В моих документах нет файлов и папок")
   For $d = 1 To $aMyDocumentsFiles[0]
    $iCheck = _ArraySearch($Yar_Data, $aMyDocumentsFiles[$d], 1)
	If $iCheck = -1 Then FileDelete($iCheck)
	   Next
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Потому что вы удаляете все время файл "-1"
 
Автор
C

CurtNN

Новичок
Сообщения
5
Репутация
0
Программа сразу выдает что файлы не найдены ошиибка где то в
Код:
Global $Yar_Data = StringSplit("3ds Max 2010 Tutorials|3dsMax|Fax|InterVideo|KMPlayer|LEGO Creations|My Meetings|STDUViewer|The KMPlayer|Отсканированные документы", "|")
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Код:
$aMyDocumentsFiles = _FileListToArray(@MyDocumentsDir,"*")

Вместо 0 - звездочка
 
Автор
C

CurtNN

Новичок
Сообщения
5
Репутация
0
Спасибо, теперь не ругается, но и не удаляет :(
 
Автор
C

CurtNN

Новичок
Сообщения
5
Репутация
0
Мне нужно удалить все кроме массива
Код:
$Yar_Data
, а при вашем раскладе он вроде все удалит, я новичок сильно не пинайте
 
A

Alecsis1

Гость
Может, так?
Код:
#include <Array.au3>
#include <File.au3>

Opt("MustDeclareVars", 1)

Global  $Yar_Data = StringSplit("3ds Max 2010 Tutorials|3dsMax|Fax|InterVideo|KMPlayer|LEGO Creations|My Meetings|STDUViewer|The KMPlayer|Отсканированные документы", "|")

; ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
Local   $sFolder = @TempDir       ; !!! от греха подальше подопытный кролик = папка TEMP !!!
; ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~

Local   $sCurDir = @WorkingDir    ; сохранить тек. рабочий каталог

Local   $aMyDocumentsFiles, $d, $iCheck, $sFAttr, $sItem

If FileChangeDir($sFolder) = 0 Then
  MsgBox(0x10, "Отсос!", $sFolder & @CRLF & "Заданная папка недоступна/не существует!")
  Exit 999
EndIf

$aMyDocumentsFiles = _FileListToArray($sFolder, "*")

If @error <> 0 Then
    MsgBox(0x10, "Отсос!", $sFolder & @CRLF & "Заданная папка пустая!")
    Exit 99
EndIf


For $d = 1 To $aMyDocumentsFiles[0]
  $sItem  = $aMyDocumentsFiles[$d]
  $iCheck = _ArraySearch($Yar_Data, $sItem, 1)
  If $iCheck > 0 Then
      ;
      ; этот обнаруженный элемент в «белом списке»,
      ; поэтому ничего не делаем и крутим цикл дальше
      ;
      ContinueLoop

    Else
      ; а этот эл-т (файл либо папка) попал под раздачу
      ;
      $sFAttr = FileGetAttrib($sItem) ; атрибуты понадобятся далее

      ; в обоих случаях не забываем:
      ; если файл/папка в данный момент используются каким-то другим процессом,
      ; то удаление не прокатит!
      ; из сообр. политкорректности (или для эстетов :-) надо бы проверять
      ; коды возврата DirRemove/FileDelete и выдавать сообщение о пролёте мимо кассы
      ;
      If StringInStr($sFAttr, "D", False) Then
          DirRemove($sItem, True)     ; это папка, похерить её со всем, что в ней есть
        Else
          FileDelete($sItem)          ; а это файл, просто убить его
      EndIf
   EndIf
 Next

FileChangeDir($sCurDir)   ; вернуть тек. папку, как было до запуска скрипта!
Exit

Коцает под корень всё, что не в белом списке, ну и по понятным причинам не удаляет мусорные файлы, открытые другими процессами


Добавлено:
Сообщение автоматически объединено:

P.S. Забытое в спешке уточнение:
не забываем про этот вызов FileChangeDir, иначе вместо ожидаемых «Моих документов» (или что там ещё надо чистить) будет обработана текущая папка со всеми вытекающими последствиями типа потери собственных изысканий + геморроя c их последующим восстановлением :mad:
Код:
If FileChangeDir($sFolder) = 0 Then ......
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Alecsis1 [?]
не забываем про этот вызов FileChangeDir
Если поменять
Код:
;...
DirRemove($sItem, True)
;и
FileDelete($sItem)
;на
$sFolder
DirRemove($sFolder & '\' & $sItem, 1)
;и
FileDelete($sFolder & '\' & $sItem)
;...
то, ИМХО, можно обойтись без FileChangeDir.
 

beliy

Продвинутый
Сообщения
372
Репутация
72
Я бы рекомендовал для такой задачи посмотреть в сторону "песочниц". При их использовании система возвращается в исходное состояние после перезагрузки ПК.
Небольшое сравнение песочниц - http://virusinfo.info/showthread.php?t=77344
Для вашей задачи думаю удобнее всего будет Shadow Defender, а там смотрите сами.
 
Верх