Автор Тема: Помогите написать скрипт удаления файлов в разных папках на разных дисках  (Прочитано 7039 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн sanf [?]

  • Новичок
  • *
  • Сообщений: 30
  • Репутация: 0
    • Награды
Помогите пожалуйста написать скрипт удаления файлов старше 6 дней, в разных папках на разных дисках. К примеру в папках backup на E: F: G:

Я руководствовался другим скриптом написаном на форуме, но я не пойму как сделать несколько переменных path:

Код: AutoIt [Выделить]
#include <Date.au3>

$path = "G:\backup";папка для очистки
$delta = "6" ; кол-во дней, старше которых удаляем
$aReturn = _FileSearch($path, '*.*')

For $i = 1 To UBound($aReturn) - 1
    $aTime = FileGetTime($aReturn[$i])
    If _DateDiff('D', $aTime[0] & '/' & $aTime[1] & '/' & $aTime[2], _NowCalc()) > $delta Then
        FileDelete($aReturn[$i])
    EndIf
Next

Func _FileSearch($sPath, $sFileMask)
    Local $sOut = StringToBinary("0" & @CRLF, 2), $aOut
    Local $hDir = Run(@ComSpec & ' /U/C DIR "' & $sPath & '\' & $sFileMask & '" /S/B/A-D', @SystemDir, @SW_HIDE, 6)

    While 1
        $sOut &= StdoutRead($hDir, False, True)
        If @error Then ExitLoop
    WEnd

    $aOut = StringRegExp(BinaryToString($sOut, 2), "[^\r\n]+", 3)
    If @error Then Return SetError(1)

    $aOut[0] = UBound($aOut) - 1
    Return $aOut
 EndFunc   ;==>_FileSearch
 

« Последнее редактирование: Июль 27, 2012, 00:22:50 от sanf »

Русское сообщество AutoIt


Оффлайн Kaster [?]

  • Бритва, Бритва Оккама
  • Глобальный модератор
  • *
  • Сообщений: 4020
  • Репутация: 622
  • Пол: Мужской
  • Мой Аватар, он лучший самый
    • Награды
  • Версия AutoIt: 3.3.14.0
ПредупреждениеЗа нарушение правил форума (пункт В.11):
Цитировать
Любые отрывки AutoIt кода необходимо заключать в тег [autoit] (подробнее), а обычный код соответственно в тег [code] (подробнее). Также большие выдержки текста помещайте под тег [spoiler] (подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Глобальный модератор.
Конференция посвященная AutoIt на jabber.ru - [email protected]
Как попасть на конференцию читаем тут


Онлайн joiner [?]

  • Расмус-бродяга
  • AutoIt Гуру
  • *****
  • Сообщений: 2781
  • Репутация: 469
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
sanf
используй теги для оформления кода. вот так
Код: AutoIt [Выделить]
$aArray = DriveGetDrive("fixed")
For $1i = 1 To UBound($aArray) - 1
    $aReturn = _FileSearch($aArray[$1i], "*", 1, 1)
    For $i = 1 To UBound($aReturn) - 1
                $aTime = FileGetTime($aReturn[$i])
        If _DateDiff('D', $aTime[0] & '/' & $aTime[1] & '/' & $aTime[2], _NowCalc()) > $delta Then
            FileDelete($aReturn[$i])
        EndIf
    Next
Next

ну , вобщем , это и решение
Были времена, когда солнце было ярче, трава зеленее, а водка сорокоградуснее

Оффлайн sanf [?]

  • Новичок
  • *
  • Сообщений: 30

  • Автор темы
  • Репутация: 0
    • Награды
мм либо я не туда тэг вставляю....либо я еще чтот не то делаю..., а что останется в $path ?
если вас не затруднит подскажите как будет выглядеть весь код

Русское сообщество AutoIt


Оффлайн AZJIO [?]

  • VIP
  • *
  • Сообщений: 2725
  • Репутация: 1140
    • мой сайт
    • Награды
  • Версия AutoIt: 3.3.8.1
sanf

Код: AutoIt [Выделить]
#include <Array.au3> ; это для _ArrayDisplay
$n=3 ; количество удаляемых файлов, он же влияет на размер массива
; Создание массива с путями
Global $FileList[$n+1] = [$n, _
'C:\file1', _
'D:\file2', _
'C:\fileN']

_ArrayDisplay($FileList, 'пути') ; это для просмотра массива перед тем как удалить
; Exit ; для теста массива без удаления

$err = '' ; это для лога ошибок, если не удалось удалить какой либо файл
For $i = 1 To $FileList[0]
    If Not FileDelete($FileList[$i]) Then
        If Not (FileSetAttrib($FileList[$i], '-RST') And FileDelete($FileList[$i])) Then
            $err &= $FileList[$i] & @CRLF
        EndIf
    EndIf
Next
If $err Then MsgBox(0, 'Ошибка', $err)


joiner
Опасный скрипт у вас, если ему дать волю удалит все файлы на дисках.

Оффлайн ssvih [?]

  • Новичок
  • *
  • Сообщений: 35
  • Репутация: 1
  • Пол: Мужской
    • Награды
Цитировать
Я руководствовался другим скриптом написаном на форуме, но я не пойму как сделать несколько переменных path:

Ваш path
Код: AutoIt [Выделить]
$path = "G:\backup";папка для очистки
 


То что нужно вставить вместо
Код: AutoIt [Выделить]
$path[4] = [3, 'C:\backup', D:\backup', E:\backup']
 

Судя по тому как меня трахает жизнь, я 100% сексуален )

Онлайн joiner [?]

  • Расмус-бродяга
  • AutoIt Гуру
  • *****
  • Сообщений: 2781
  • Репутация: 469
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
AZJIO
ну это да  :). но если нужно найти спец.файл, то пойдет, только указать имя файла вместо звездочки. если нет, то как и было показано через объявление массива.


(нажмите для показа/скрытия)
« Последнее редактирование: Июль 27, 2012, 03:04:17 от joiner »

Оффлайн AZJIO [?]

  • VIP
  • *
  • Сообщений: 2725
  • Репутация: 1140
    • мой сайт
    • Награды
  • Версия AutoIt: 3.3.8.1
Видимо я ТЗ неправильно понял, вот подобный пример.

joiner
Зачем снимать атрибуты, если в 95% случаев атрибуты отсутствуют. А на снятие атрибутов тратится время.


Русское сообщество AutoIt


Онлайн joiner [?]

  • Расмус-бродяга
  • AutoIt Гуру
  • *****
  • Сообщений: 2781
  • Репутация: 469
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
AZJIO
чтобы было, а вдруг есть атрибуты. можно и без них :)

Оффлайн AZJIO [?]

  • VIP
  • *
  • Сообщений: 2725
  • Репутация: 1140
    • мой сайт
    • Награды
  • Версия AutoIt: 3.3.8.1
joiner
Я не про то чтобы не использовать, я про то чтобы снимать атрибуты только в случае если файл не удалось удалить.

Онлайн joiner [?]

  • Расмус-бродяга
  • AutoIt Гуру
  • *****
  • Сообщений: 2781
  • Репутация: 469
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
сегодня был момент, когда нужно было снять атрибуты скрытый и для чтения со 100гб файлов. на стареньком пне с 512мб оперативы заняло секунд 20. снимал естественно похожим скриптом. диск был во внешнем боксе. много это или мало - не знаю.
в принципе можно вставить твой цикл на проверку существования атрибутов, но это тоже время. ну и как ты сказал, можно вообще обойтись без этого, если пользователь удаляет свои файлы, а не системные.
AZJIO
я ж не претендую на оригинальность или исключительную эффективность предложенного метода. то, о чем мы сейчас говорим это нюансы. думаю что ТС самому будет интересно разобраться в таких моментах и сделать улучшение.

Оффлайн AZJIO [?]

  • VIP
  • *
  • Сообщений: 2725
  • Репутация: 1140
    • мой сайт
    • Награды
  • Версия AutoIt: 3.3.8.1
joiner
в моём варианте:
Если в каталоге преобладают файлы с атрибутами, то скрипт работает по схеме:
FileDelete, FileSetAttrib, FileDelete
если файлы преобладают без атрибутов, то скрипт работает по схеме:
FileDelete

В вашем варианте в любом случае
FileSetAttrib, FileDelete

Итог если файлов с атрибутами и без 50/50 то оба варианта отрабатывают одинаково. Но лично у меня даже в системной папке (WinXP) с большим приоритетом преобладают файлы без атрибутов (RST).

Русское сообщество AutoIt


 

Похожие темы

  Тема / Автор Ответов Последний ответ
0 Ответов
4498 Просмотров
Последний ответ Ноябрь 23, 2009, 05:27:37
от kolyan-xerox
12 Ответов
10879 Просмотров
Последний ответ Август 03, 2018, 19:36:42
от Vladimir02
9 Ответов
6617 Просмотров
Последний ответ Февраль 03, 2011, 14:59:40
от ~HZ~
19 Ответов
23116 Просмотров
Последний ответ Ноябрь 03, 2015, 02:23:08
от Skif_off
3 Ответов
2650 Просмотров
Последний ответ Май 31, 2012, 15:58:13
от Foley
5 Ответов
2935 Просмотров
Последний ответ Ноябрь 22, 2012, 06:14:16
от AZJIO
5 Ответов
3096 Просмотров
Последний ответ Апрель 04, 2013, 18:58:36
от InnI
0 Ответов
1150 Просмотров
Последний ответ Сентябрь 03, 2015, 18:22:22
от uritalex
0 Ответов
707 Просмотров
Последний ответ Сентябрь 03, 2015, 18:44:52
от madmasles
1 Ответов
1052 Просмотров
Последний ответ Сентябрь 19, 2015, 12:06:40
от alex33